1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

MTE: Do not pad size in realloc_check

The MTE patch to add malloc support incorrectly padded the size passed
to _int_realloc by SIZE_SZ when it ought to have sent just the
chunksize.  Revert that bit of the change so that realloc works
correctly with MALLOC_CHECK_ set.

This also brings the realloc_check implementation back in sync with
libc_realloc.
This commit is contained in:
Siddhesh Poyarekar
2020-12-23 07:41:17 +05:30
parent 4f969166ce
commit 84c202246b

View File

@ -315,7 +315,7 @@ realloc_check (void *oldmem, size_t bytes, const void *caller)
__libc_lock_unlock (main_arena.mutex); __libc_lock_unlock (main_arena.mutex);
if (!oldp) if (!oldp)
malloc_printerr ("realloc(): invalid pointer"); malloc_printerr ("realloc(): invalid pointer");
const INTERNAL_SIZE_T oldchsize = CHUNK_AVAILABLE_SIZE (oldp); const INTERNAL_SIZE_T oldsize = chunksize (oldp);
if (!checked_request2size (rb, &chnb)) if (!checked_request2size (rb, &chnb))
goto invert; goto invert;
@ -331,7 +331,8 @@ realloc_check (void *oldmem, size_t bytes, const void *caller)
else else
#endif #endif
{ {
if (oldchsize >= chnb) /* Note the extra SIZE_SZ overhead. */
if (oldsize - SIZE_SZ >= chnb)
newmem = oldmem; /* do nothing */ newmem = oldmem; /* do nothing */
else else
{ {
@ -340,7 +341,7 @@ realloc_check (void *oldmem, size_t bytes, const void *caller)
newmem = _int_malloc (&main_arena, rb); newmem = _int_malloc (&main_arena, rb);
if (newmem) if (newmem)
{ {
memcpy (newmem, oldmem, oldchsize - CHUNK_HDR_SZ); memcpy (newmem, oldmem, oldsize - CHUNK_HDR_SZ);
munmap_chunk (oldp); munmap_chunk (oldp);
} }
} }
@ -349,7 +350,7 @@ realloc_check (void *oldmem, size_t bytes, const void *caller)
else else
{ {
top_check (); top_check ();
newmem = _int_realloc (&main_arena, oldp, oldchsize, chnb); newmem = _int_realloc (&main_arena, oldp, oldsize, chnb);
} }
DIAG_PUSH_NEEDS_COMMENT; DIAG_PUSH_NEEDS_COMMENT;