Loading...
--- dyld/dyld-1122.1/common/DyldSharedCache.cpp
+++ dyld/dyld-1162/common/DyldSharedCache.cpp
@@ -282,6 +282,40 @@
}
}
+const char* DyldSharedCache::mappingName(uint32_t maxProt, uint64_t flags)
+{
+ const char* mappingName = "";
+ if ( maxProt & VM_PROT_EXECUTE ) {
+ if ( flags & DYLD_CACHE_MAPPING_TEXT_STUBS ) {
+ mappingName = "__TEXT_STUBS";
+ } else {
+ mappingName = "__TEXT";
+ }
+ } else if ( maxProt & VM_PROT_WRITE ) {
+ if ( flags & DYLD_CACHE_MAPPING_AUTH_DATA ) {
+ if ( flags & DYLD_CACHE_MAPPING_DIRTY_DATA )
+ mappingName = "__AUTH_DIRTY";
+ else if ( flags & DYLD_CACHE_MAPPING_CONST_DATA )
+ mappingName = "__AUTH_CONST";
+ else
+ mappingName = "__AUTH";
+ } else {
+ if ( flags & DYLD_CACHE_MAPPING_DIRTY_DATA )
+ mappingName = "__DATA_DIRTY";
+ else if ( flags & DYLD_CACHE_MAPPING_CONST_DATA )
+ mappingName = "__DATA_CONST";
+ else
+ mappingName = "__DATA";
+ }
+ }
+ else if ( maxProt & VM_PROT_READ ) {
+ mappingName = "__LINKEDIT";
+ } else {
+ mappingName = "*unknown*";
+ }
+ return mappingName;
+}
+
void DyldSharedCache::forEachRange(void (^handler)(const char* mappingName,
uint64_t unslidVMAddr, uint64_t vmSize,
uint32_t cacheFileIndex, uint64_t fileOffset,
@@ -293,35 +327,7 @@
forEachCache(^(const DyldSharedCache *cache, bool& stopCache) {
cache->forEachRegion(^(const void *content, uint64_t unslidVMAddr, uint64_t size,
uint32_t initProt, uint32_t maxProt, uint64_t flags, bool& stopRegion) {
- const char* mappingName = "";
- if ( maxProt & VM_PROT_EXECUTE ) {
- if ( flags & DYLD_CACHE_MAPPING_TEXT_STUBS ) {
- mappingName = "__TEXT_STUBS";
- } else {
- mappingName = "__TEXT";
- }
- } else if ( maxProt & VM_PROT_WRITE ) {
- if ( flags & DYLD_CACHE_MAPPING_AUTH_DATA ) {
- if ( flags & DYLD_CACHE_MAPPING_DIRTY_DATA )
- mappingName = "__AUTH_DIRTY";
- else if ( flags & DYLD_CACHE_MAPPING_CONST_DATA )
- mappingName = "__AUTH_CONST";
- else
- mappingName = "__AUTH";
- } else {
- if ( flags & DYLD_CACHE_MAPPING_DIRTY_DATA )
- mappingName = "__DATA_DIRTY";
- else if ( flags & DYLD_CACHE_MAPPING_CONST_DATA )
- mappingName = "__DATA_CONST";
- else
- mappingName = "__DATA";
- }
- }
- else if ( maxProt & VM_PROT_READ ) {
- mappingName = "__LINKEDIT";
- } else {
- mappingName = "*unknown*";
- }
+ const char* mappingName = DyldSharedCache::mappingName(maxProt, flags);
uint64_t fileOffset = (uint8_t*)content - (uint8_t*)cache;
bool stop = false;
handler(mappingName, unslidVMAddr, size, cacheFileIndex, fileOffset, initProt, maxProt, stop);
@@ -407,7 +413,7 @@
}
}
-bool DyldSharedCache::inCache(const void* addr, size_t length, bool& readOnly) const
+bool DyldSharedCache::inCache(const void* addr, size_t length, bool& immutable) const
{
// quick out if before start of cache
if ( addr < this )
@@ -417,22 +423,19 @@
uintptr_t slide = (uintptr_t)this - (uintptr_t)(mappings[0].address);
uintptr_t unslidStart = (uintptr_t)addr - slide;
- // quick out if after end of cache
- const dyld_cache_mapping_info* lastMapping = &mappings[header.mappingCount - 1];
- if ( unslidStart > (lastMapping->address + lastMapping->size) )
- return false;
-
- // walk cache regions
- const dyld_cache_mapping_info* mappingsEnd = &mappings[header.mappingCount];
- uintptr_t unslidEnd = unslidStart + length;
- for (const dyld_cache_mapping_info* m=mappings; m < mappingsEnd; ++m) {
- if ( (unslidStart >= m->address) && (unslidEnd < (m->address+m->size)) ) {
- readOnly = ((m->initProt & VM_PROT_WRITE) == 0);
- return true;
- }
- }
-
- return false;
+ // walk cache ranges
+ __block bool found = false;
+ auto inRange = ^(const char* mappingName, uint64_t unslidVMAddr, uint64_t vmSize, uint32_t cacheFileIndex,
+ uint64_t fileOffset, uint32_t initProt, uint32_t maxProt, bool& stopRange) {
+ if ( (unslidVMAddr <= unslidStart) && ((unslidStart+length) < (unslidVMAddr+vmSize)) ) {
+ found = true;
+ immutable = ((maxProt & VM_PROT_WRITE) == 0);
+ stopRange = true;
+ }
+ };
+ this->forEachRange(inRange, nullptr);
+
+ return found;
}
bool DyldSharedCache::isAlias(const char* path) const {