1*68d75effSDimitry Andric //===-- sanitizer_procmaps_solaris.cpp ------------------------------------===// 2*68d75effSDimitry Andric // 3*68d75effSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*68d75effSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*68d75effSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*68d75effSDimitry Andric // 7*68d75effSDimitry Andric //===----------------------------------------------------------------------===// 8*68d75effSDimitry Andric // 9*68d75effSDimitry Andric // Information about the process mappings (Solaris-specific parts). 10*68d75effSDimitry Andric //===----------------------------------------------------------------------===// 11*68d75effSDimitry Andric 12*68d75effSDimitry Andric #include "sanitizer_platform.h" 13*68d75effSDimitry Andric #if SANITIZER_SOLARIS 14*68d75effSDimitry Andric #include "sanitizer_common.h" 15*68d75effSDimitry Andric #include "sanitizer_procmaps.h" 16*68d75effSDimitry Andric 17*68d75effSDimitry Andric // Before Solaris 11.4, <procfs.h> doesn't work in a largefile environment. 18*68d75effSDimitry Andric #undef _FILE_OFFSET_BITS 19*68d75effSDimitry Andric #include <procfs.h> 20*68d75effSDimitry Andric #include <limits.h> 21*68d75effSDimitry Andric 22*68d75effSDimitry Andric namespace __sanitizer { 23*68d75effSDimitry Andric 24*68d75effSDimitry Andric void ReadProcMaps(ProcSelfMapsBuff *proc_maps) { 25*68d75effSDimitry Andric if (!ReadFileToBuffer("/proc/self/xmap", &proc_maps->data, 26*68d75effSDimitry Andric &proc_maps->mmaped_size, &proc_maps->len)) { 27*68d75effSDimitry Andric proc_maps->data = nullptr; 28*68d75effSDimitry Andric proc_maps->mmaped_size = 0; 29*68d75effSDimitry Andric proc_maps->len = 0; 30*68d75effSDimitry Andric } 31*68d75effSDimitry Andric } 32*68d75effSDimitry Andric 33*68d75effSDimitry Andric bool MemoryMappingLayout::Next(MemoryMappedSegment *segment) { 34*68d75effSDimitry Andric if (Error()) return false; // simulate empty maps 35*68d75effSDimitry Andric char *last = data_.proc_self_maps.data + data_.proc_self_maps.len; 36*68d75effSDimitry Andric if (data_.current >= last) return false; 37*68d75effSDimitry Andric 38*68d75effSDimitry Andric prxmap_t *xmapentry = (prxmap_t*)data_.current; 39*68d75effSDimitry Andric 40*68d75effSDimitry Andric segment->start = (uptr)xmapentry->pr_vaddr; 41*68d75effSDimitry Andric segment->end = (uptr)(xmapentry->pr_vaddr + xmapentry->pr_size); 42*68d75effSDimitry Andric segment->offset = (uptr)xmapentry->pr_offset; 43*68d75effSDimitry Andric 44*68d75effSDimitry Andric segment->protection = 0; 45*68d75effSDimitry Andric if ((xmapentry->pr_mflags & MA_READ) != 0) 46*68d75effSDimitry Andric segment->protection |= kProtectionRead; 47*68d75effSDimitry Andric if ((xmapentry->pr_mflags & MA_WRITE) != 0) 48*68d75effSDimitry Andric segment->protection |= kProtectionWrite; 49*68d75effSDimitry Andric if ((xmapentry->pr_mflags & MA_EXEC) != 0) 50*68d75effSDimitry Andric segment->protection |= kProtectionExecute; 51*68d75effSDimitry Andric 52*68d75effSDimitry Andric if (segment->filename != NULL && segment->filename_size > 0) { 53*68d75effSDimitry Andric char proc_path[PATH_MAX + 1]; 54*68d75effSDimitry Andric 55*68d75effSDimitry Andric internal_snprintf(proc_path, sizeof(proc_path), "/proc/self/path/%s", 56*68d75effSDimitry Andric xmapentry->pr_mapname); 57*68d75effSDimitry Andric internal_readlink(proc_path, segment->filename, segment->filename_size); 58*68d75effSDimitry Andric } 59*68d75effSDimitry Andric 60*68d75effSDimitry Andric data_.current += sizeof(prxmap_t); 61*68d75effSDimitry Andric 62*68d75effSDimitry Andric return true; 63*68d75effSDimitry Andric } 64*68d75effSDimitry Andric 65*68d75effSDimitry Andric } // namespace __sanitizer 66*68d75effSDimitry Andric 67*68d75effSDimitry Andric #endif // SANITIZER_SOLARIS 68