| diff -aruN a/CFRuntime.c b/CFRuntime.c |
| --- a/CFRuntime.c 2009-02-19 08:32:54.000000000 -0800 |
| +++ b/CFRuntime.c 2011-08-10 16:32:44.000000000 -0700 |
| @@ -73,11 +73,6 @@ |
| CF_INLINE size_t malloc_size(void* memblock) { |
| return _msize(memblock); |
| } |
| -#elif DEPLOYMENT_TARGET_LINUX |
| -#include <malloc.h> |
| -CF_INLINE size_t malloc_size(const void *memblock) { |
| - return malloc_usable_size((void *)memblock); |
| -} |
| #endif |
| |
| extern void __HALT(void); |
| @@ -264,12 +259,21 @@ |
| if (NULL == memory) { |
| return NULL; |
| } |
| -#if DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_LINUX |
| +#if DEPLOYMENT_TARGET_WINDOWS |
| // malloc_size won't work if the memory address has been moved |
| // (such as a custom allocator that adds its own metadata |
| // (e.g. under/overflow guard data), so don't attempt to call it |
| // on the allocation return. |
| size_t msize = (usesSystemDefaultAllocator) ? malloc_size(memory) : size; |
| +#elif DEPLOYMENT_TARGET_LINUX |
| + // On Linux, across various architectures and versions of the GNU |
| + // C Library, malloc_usable_size has been observed to at times return |
| + // incorrect values. Since the introspection value-add it provides to |
| + // CoreFoundation seems to be of limited utility, we eliminate it and |
| + // simpy use the caller-requested size. In addition, memsetting this |
| + // small tail block has also been found to cause heap consistency |
| + // problems. |
| + size_t msize = size; |
| #else |
| size_t msize = malloc_size(memory); |
| #endif |
| @@ -1098,6 +1100,7 @@ |
| usesSystemDefaultAllocator = (allocator == kCFAllocatorSystemDefault); |
| |
| if (__CFZombieLevel & (1 << 0)) { |
| +#if !DEPLOYMENT_TARGET_LINUX |
| uint8_t *ptr = (uint8_t *)cf - (usesSystemDefaultAllocator ? 0 : sizeof(CFAllocatorRef)); |
| size_t size = malloc_size(ptr); |
| uint8_t byte = 0xFC; |
| @@ -1109,6 +1112,7 @@ |
| byte = (__CFZombieLevel >> 8) & 0xFF; |
| } |
| memset(ptr, byte, size); |
| +#endif /* !DEPLOYMENT_TARGET_LINUX */ |
| } |
| if (!(__CFZombieLevel & (1 << 4))) { |
| CFAllocatorDeallocate(allocator, (uint8_t *)cf - (usesSystemDefaultAllocator ? 0 : sizeof(CFAllocatorRef))); |