struct debug *_dl_debug_addr = &debug;
+__attribute__((__visibility__("hidden")))
+extern int __malloc_replaced;
+
__attribute__((__visibility__("hidden")))
void (*const __init_array_start)(void)=0, (*const __fini_array_start)(void)=0;
if (ldso_fail) _exit(127);
if (ldd_mode) _exit(0);
+ /* Determine if malloc was interposed by a replacement implementation
+ * so that calloc and the memalign family can harden against the
+ * possibility of incomplete replacement. */
+ if (find_sym(head, "malloc", 1).dso != &ldso)
+ __malloc_replaced = 1;
+
/* Switch to runtime mode: any further failures in the dynamic
* linker are a reportable failure rather than a fatal startup
* error. */
__attribute__((__visibility__("hidden")))
void __bin_chunk(struct chunk *);
+__attribute__((__visibility__("hidden")))
+extern int __malloc_replaced;
+
#endif
volatile int free_lock[2];
} mal;
+int __malloc_replaced;
+
/* Synchronization tools */
static inline void lock(volatile int *lk)
}
n *= m;
void *p = malloc(n);
- if (!p || IS_MMAPPED(MEM_TO_CHUNK(p)))
- return p;
- if (n >= PAGE_SIZE)
- n = mal0_clear(p, PAGE_SIZE, n);
+ if (!p) return p;
+ if (!__malloc_replaced) {
+ if (IS_MMAPPED(MEM_TO_CHUNK(p)))
+ return p;
+ if (n >= PAGE_SIZE)
+ n = mal0_clear(p, PAGE_SIZE, n);
+ }
return memset(p, 0, n);
}