]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/IOLib.cpp
xnu-3789.51.2.tar.gz
[apple/xnu.git] / iokit / Kernel / IOLib.cpp
index 01f751a86cf4b917cd100c606beedcb330cfb695..73a0c67a80191d0f859bc8fcb58f3677ca857b83 100644 (file)
@@ -295,15 +295,25 @@ void * IOMalloc(vm_size_t size)
     return address;
 }
 
-void IOFree(void * address, vm_size_t size)
+void IOFree(void * inAddress, vm_size_t size)
 {
-    if (address) {
+    void * address;
 
+    if ((address = inAddress))
+    {
        address = (typeof(address)) (((uintptr_t) address) - sizeofIOLibMallocHeader);
        
 #if IOTRACKING
-       if (TRACK_ALLOC) {
+       if (TRACK_ALLOC)
+       {
            IOLibMallocHeader * hdr;
+           struct ptr_reference{ void * ptr; };
+           volatile struct ptr_reference ptr;
+
+            // we're about to block in IOTrackingRemove(), make sure the original pointer
+            // exists in memory or a register for leak scanning to find
+            ptr.ptr = inAddress;
+
            hdr = (typeof(hdr)) address;
             if (size != hdr->tracking.size)
            {
@@ -311,6 +321,7 @@ void IOFree(void * address, vm_size_t size)
                size = hdr->tracking.size;
            }
            IOTrackingRemove(gIOMallocTracking, &hdr->tracking.tracking, size);
+            ptr.ptr = NULL;
        }
 #endif
 
@@ -746,7 +757,7 @@ kern_return_t IOIteratePageableMaps(vm_size_t size,
             else
                 index = gIOKitPageableSpace.count - 1;
         }
-        if( KERN_SUCCESS == kr)
+        if (KERN_NO_SPACE != kr)
             break;
 
         lck_mtx_lock( gIOKitPageableSpace.lock );