Have the two malloc zones print useful diagnostics if their free method are unexpecte...
authormrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Jan 2008 08:02:06 +0000 (08:02 +0000)
committermrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Jan 2008 08:02:06 +0000 (08:02 +0000)
Due to <rdar://problem/5671357> this can happen if an application attempts to free a pointer that
was not allocated by any registered malloc zone on the system.

Reviewed by Maciej Stachowiak.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@29194 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/CollectorHeapIntrospector.h
JavaScriptCore/wtf/FastMalloc.cpp

index 499ef5752de4bab10cca52b352885e369d1914dc..0e92ba6e7b1027080b6bf4709760615f088056a9 100644 (file)
@@ -1,3 +1,14 @@
+2008-01-04  Mark Rowe  <mrowe@apple.com>
+
+        Reviewed by Maciej Stachowiak.
+
+        Have the two malloc zones print useful diagnostics if their free method are unexpectedly invoked.
+        Due to <rdar://problem/5671357> this can happen if an application attempts to free a pointer that
+        was not allocated by any registered malloc zone on the system.
+
+        * kjs/CollectorHeapIntrospector.h:
+        * wtf/FastMalloc.cpp:
+
 2008-01-04  Alp Toker  <alp@atoker.com>
 
         GTK+ autotools build fix. Terminate empty rules.
index 5bfdd490e84f1949d3c29badc84864ce78f91e86..76ba3248f93b549b2b2bf5989e59870e7fcce063 100644 (file)
@@ -53,11 +53,18 @@ private:
     static size_t size(malloc_zone_t*, const void*) { return 0; }
     static void* zoneMalloc(malloc_zone_t*, size_t) { LOG_ERROR("malloc is not supported"); return 0; }
     static void* zoneCalloc(malloc_zone_t*, size_t, size_t) { LOG_ERROR("calloc is not supported"); return 0; }
-    static void zoneFree(malloc_zone_t*, void*) { LOG_ERROR("free is not supported"); }
     static void* zoneRealloc(malloc_zone_t*, void*, size_t) { LOG_ERROR("realloc is not supported"); return 0; }
     static void* zoneValloc(malloc_zone_t*, size_t) { LOG_ERROR("valloc is not supported"); return 0; }
     static void zoneDestroy(malloc_zone_t*) { }
 
+    static void zoneFree(malloc_zone_t*, void* ptr)
+    {
+        // Due to <rdar://problem/5671357> zoneFree may be called by the system free even if the pointer
+        // is not in this zone.  When this happens, the pointer being freed was not allocated by any
+        // zone so we need to print a useful error for the application developer.
+        malloc_printf("*** error for object %p: pointer being freed was not allocated\n", ptr);
+    }
+
     malloc_zone_t m_zone;
     CollectorHeap* m_primaryHeap;
     CollectorHeap* m_numberHeap;
index c92a6da49fac999ed555faa8747eeb2e3fe36a1a..083cbbf318943c656a587105aa143da2485798c7 100644 (file)
@@ -3573,8 +3573,12 @@ void* FastMallocZone::zoneCalloc(malloc_zone_t*, size_t, size_t)
     return 0;
 }
 
-void FastMallocZone::zoneFree(malloc_zone_t*, void*)
+void FastMallocZone::zoneFree(malloc_zone_t*, void* ptr)
 {
+    // Due to <rdar://problem/5671357> zoneFree may be called by the system free even if the pointer
+    // is not in this zone.  When this happens, the pointer being freed was not allocated by any
+    // zone so we need to print a useful error for the application developer.
+    malloc_printf("*** error for object %p: pointer being freed was not allocated\n", ptr);
 }
 
 void* FastMallocZone::zoneRealloc(malloc_zone_t*, void*, size_t)