提交 618b18c7 编写于 作者: R Rich Felker

revert detection of partially-replaced allocator

commit c9f415d7 included checks to
make calloc fallback to memset if used with a replaced malloc that
didn't also replace calloc, and the memalign family fail if free has
been replaced. however, the checks gave false positives for
replacement whenever malloc or free resolved to a PLT entry in the
main program.

for now, disable the checks so as not to leave libc in a broken state.
this means that the properties documented in the above commit are no
longer satisfied; failure to replace calloc and the memalign family
along with malloc is unsafe if they are ever called.

the calloc checks were correct but useless for static linking. in both
cases (simple or full malloc), calloc and malloc are in a source file
together, so replacement of one but not the other would give linking
errors. the memalign-family check was useful for static linking, but
broken for dynamic as described above, and can be replaced with a
better link-time check.
上级 3f3cc3e9
...@@ -50,7 +50,7 @@ weak_alias(__simple_malloc, malloc); ...@@ -50,7 +50,7 @@ weak_alias(__simple_malloc, malloc);
static void *__simple_calloc(size_t m, size_t n) static void *__simple_calloc(size_t m, size_t n)
{ {
if (n && m > (size_t)-1/n || malloc != __simple_malloc) { if (n && m > (size_t)-1/n) {
errno = ENOMEM; errno = ENOMEM;
return 0; return 0;
} }
......
...@@ -368,8 +368,6 @@ void *malloc(size_t n) ...@@ -368,8 +368,6 @@ void *malloc(size_t n)
return CHUNK_TO_MEM(c); return CHUNK_TO_MEM(c);
} }
weak_alias(malloc, __internal_malloc);
static size_t mal0_clear(char *p, size_t pagesz, size_t n) static size_t mal0_clear(char *p, size_t pagesz, size_t n)
{ {
#ifdef __GNUC__ #ifdef __GNUC__
...@@ -396,13 +394,10 @@ void *calloc(size_t m, size_t n) ...@@ -396,13 +394,10 @@ void *calloc(size_t m, size_t n)
} }
n *= m; n *= m;
void *p = malloc(n); void *p = malloc(n);
if (!p) return p; if (!p || IS_MMAPPED(MEM_TO_CHUNK(p)))
if (malloc == __internal_malloc) { return p;
if (IS_MMAPPED(MEM_TO_CHUNK(p))) if (n >= PAGE_SIZE)
return p; n = mal0_clear(p, PAGE_SIZE, n);
if (n >= PAGE_SIZE)
n = mal0_clear(p, PAGE_SIZE, n);
}
return memset(p, 0, n); return memset(p, 0, n);
} }
...@@ -568,8 +563,6 @@ void free(void *p) ...@@ -568,8 +563,6 @@ void free(void *p)
bin_chunk(self); bin_chunk(self);
} }
weak_alias(free, __internal_free);
void __malloc_donate(char *start, char *end) void __malloc_donate(char *start, char *end)
{ {
size_t align_start_up = (SIZE_ALIGN-1) & (-(uintptr_t)start - OVERHEAD); size_t align_start_up = (SIZE_ALIGN-1) & (-(uintptr_t)start - OVERHEAD);
......
...@@ -3,8 +3,6 @@ ...@@ -3,8 +3,6 @@
#include <errno.h> #include <errno.h>
#include "libc.h" #include "libc.h"
void __internal_free(void *);
void *__memalign(size_t align, size_t len) void *__memalign(size_t align, size_t len)
{ {
unsigned char *mem, *new, *end; unsigned char *mem, *new, *end;
...@@ -15,7 +13,7 @@ void *__memalign(size_t align, size_t len) ...@@ -15,7 +13,7 @@ void *__memalign(size_t align, size_t len)
return NULL; return NULL;
} }
if (len > SIZE_MAX - align || free != __internal_free) { if (len > SIZE_MAX - align) {
errno = ENOMEM; errno = ENOMEM;
return NULL; return NULL;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册