1//===-- sanitizer_procmaps.h ------------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file is shared between AddressSanitizer and ThreadSanitizer. 10// 11// Information about the process mappings. 12//===----------------------------------------------------------------------===// 13#ifndef SANITIZER_PROCMAPS_H 14#define SANITIZER_PROCMAPS_H 15 16#include "sanitizer_platform.h" 17 18#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \ 19 SANITIZER_APPLE || SANITIZER_SOLARIS || \ 20 SANITIZER_FUCHSIA 21 22#include "sanitizer_common.h" 23#include "sanitizer_internal_defs.h" 24#include "sanitizer_fuchsia.h" 25#include "sanitizer_linux.h" 26#include "sanitizer_mac.h" 27#include "sanitizer_mutex.h" 28 29namespace __sanitizer { 30 31// Memory protection masks. 32static const uptr kProtectionRead = 1; 33static const uptr kProtectionWrite = 2; 34static const uptr kProtectionExecute = 4; 35static const uptr kProtectionShared = 8; 36 37struct MemoryMappedSegmentData; 38 39class MemoryMappedSegment { 40 public: 41 explicit MemoryMappedSegment(char *buff = nullptr, uptr size = 0) 42 : filename(buff), filename_size(size), data_(nullptr) {} 43 ~MemoryMappedSegment() {} 44 45 bool IsReadable() const { return protection & kProtectionRead; } 46 bool IsWritable() const { return protection & kProtectionWrite; } 47 bool IsExecutable() const { return protection & kProtectionExecute; } 48 bool IsShared() const { return protection & kProtectionShared; } 49 50 void AddAddressRanges(LoadedModule *module); 51 52 uptr start; 53 uptr end; 54 uptr offset; 55 char *filename; // owned by caller 56 uptr filename_size; 57 uptr protection; 58 ModuleArch arch; 59 u8 uuid[kModuleUUIDSize]; 60 61 private: 62 friend class MemoryMappingLayout; 63 64 // This field is assigned and owned by MemoryMappingLayout if needed 65 MemoryMappedSegmentData *data_; 66}; 67 68struct ImageHeader; 69 70class MemoryMappingLayoutBase { 71 public: 72 virtual bool Next(MemoryMappedSegment *segment) { UNIMPLEMENTED(); } 73 virtual bool Error() const { UNIMPLEMENTED(); }; 74 virtual void Reset() { UNIMPLEMENTED(); } 75 76 protected: 77 ~MemoryMappingLayoutBase() {} 78}; 79 80class MemoryMappingLayout : public MemoryMappingLayoutBase { 81 public: 82 explicit MemoryMappingLayout(bool cache_enabled); 83 84// This destructor cannot be virtual, as it would cause an operator new() linking 85// failures in hwasan test cases. However non-virtual destructors emit warnings 86// in macOS build, hence disabling those 87#ifdef __clang__ 88#pragma clang diagnostic push 89#pragma clang diagnostic ignored "-Wnon-virtual-dtor" 90#endif 91 ~MemoryMappingLayout(); 92#ifdef __clang__ 93#pragma clang diagnostic pop 94#endif 95 96 virtual bool Next(MemoryMappedSegment *segment) override; 97 virtual bool Error() const override; 98 virtual void Reset() override; 99 // In some cases, e.g. when running under a sandbox on Linux, ASan is unable 100 // to obtain the memory mappings. It should fall back to pre-cached data 101 // instead of aborting. 102 static void CacheMemoryMappings(); 103 104 // Adds all mapped objects into a vector. 105 void DumpListOfModules(InternalMmapVectorNoCtor<LoadedModule> *modules); 106 107 protected: 108#if SANITIZER_APPLE 109 virtual const ImageHeader *CurrentImageHeader(); 110#endif 111 MemoryMappingLayoutData data_; 112 113 private: 114 void LoadFromCache(); 115}; 116 117// Returns code range for the specified module. 118bool GetCodeRangeForFile(const char *module, uptr *start, uptr *end); 119 120bool IsDecimal(char c); 121uptr ParseDecimal(const char **p); 122bool IsHex(char c); 123uptr ParseHex(const char **p); 124 125} // namespace __sanitizer 126 127#endif 128#endif // SANITIZER_PROCMAPS_H 129