Loading...
common/DyldSharedCache.cpp dyld-1122.1 dyld-1162
--- 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 {