Revert "malloc: Cleanup libc_realloc"

This reverts commit dea1e52af3.
This commit is contained in:
Wilco Dijkstra 2025-08-04 17:31:45 +00:00
parent 8c2b6e528d
commit 1bf4a379e8
1 changed files with 15 additions and 11 deletions

View File

@ -3504,17 +3504,17 @@ __libc_realloc (void *oldmem, size_t bytes)
void *newp; /* chunk to return */ void *newp; /* chunk to return */
/* realloc of null is supposed to be same as malloc */
if (oldmem == NULL)
return __libc_malloc (bytes);
#if REALLOC_ZERO_BYTES_FREES #if REALLOC_ZERO_BYTES_FREES
if (bytes == 0) if (bytes == 0 && oldmem != NULL)
{ {
__libc_free (oldmem); return NULL; __libc_free (oldmem); return NULL;
} }
#endif #endif
/* realloc of null is supposed to be same as malloc */
if (oldmem == NULL)
return __libc_malloc (bytes);
/* Perform a quick check to ensure that the pointer's tag matches the /* Perform a quick check to ensure that the pointer's tag matches the
memory's tag. */ memory's tag. */
if (__glibc_unlikely (mtag_enabled)) if (__glibc_unlikely (mtag_enabled))
@ -3532,13 +3532,19 @@ __libc_realloc (void *oldmem, size_t bytes)
if (bytes <= usable) if (bytes <= usable)
{ {
size_t difference = usable - bytes; size_t difference = usable - bytes;
if ((unsigned long) difference < 2 * sizeof (INTERNAL_SIZE_T)) if ((unsigned long) difference < 2 * sizeof (INTERNAL_SIZE_T)
|| (chunk_is_mmapped (oldp) && difference <= GLRO (dl_pagesize)))
return oldmem; return oldmem;
} }
/* its size */ /* its size */
const INTERNAL_SIZE_T oldsize = chunksize (oldp); const INTERNAL_SIZE_T oldsize = chunksize (oldp);
if (chunk_is_mmapped (oldp))
ar_ptr = NULL;
else
ar_ptr = arena_for_chunk (oldp);
/* Little security check which won't hurt performance: the allocator /* Little security check which won't hurt performance: the allocator
never wraps around at the end of the address space. Therefore never wraps around at the end of the address space. Therefore
we can exclude some size values which might appear here by we can exclude some size values which might appear here by
@ -3571,9 +3577,9 @@ __libc_realloc (void *oldmem, size_t bytes)
return tag_new_usable (newmem); return tag_new_usable (newmem);
} }
#endif #endif
/* Return if shrinking and mremap was unsuccessful. */ /* Note the extra SIZE_SZ overhead. */
if (bytes <= usable) if (oldsize - SIZE_SZ >= nb)
return oldmem; return oldmem; /* do nothing */
/* Must alloc, copy, free. */ /* Must alloc, copy, free. */
newmem = __libc_malloc (bytes); newmem = __libc_malloc (bytes);
@ -3585,8 +3591,6 @@ __libc_realloc (void *oldmem, size_t bytes)
return newmem; return newmem;
} }
ar_ptr = arena_for_chunk (oldp);
if (SINGLE_THREAD_P) if (SINGLE_THREAD_P)
{ {
newp = _int_realloc (ar_ptr, oldp, oldsize, nb); newp = _int_realloc (ar_ptr, oldp, oldsize, nb);