aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@sourceware.org>2020-12-23 07:41:17 +0530
committerSiddhesh Poyarekar <siddhesh@sourceware.org>2020-12-24 06:02:05 +0530
commit84c202246b74c2f75b36985ceff506b7a152c2fb (patch)
tree4b6f6ddedc5570b7636001fa6fade0883c93e793
parent4f969166ce4ab535fa798dcbaa5de4c4e05773ec (diff)
downloadglibc-84c202246b74c2f75b36985ceff506b7a152c2fb.zip
glibc-84c202246b74c2f75b36985ceff506b7a152c2fb.tar.gz
glibc-84c202246b74c2f75b36985ceff506b7a152c2fb.tar.bz2
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.
-rw-r--r--malloc/hooks.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/malloc/hooks.c b/malloc/hooks.c
index 8a1c16d..6474ba8 100644
--- a/malloc/hooks.c
+++ b/malloc/hooks.c
@@ -315,7 +315,7 @@ realloc_check (void *oldmem, size_t bytes, const void *caller)
__libc_lock_unlock (main_arena.mutex);
if (!oldp)
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))
goto invert;
@@ -331,7 +331,8 @@ realloc_check (void *oldmem, size_t bytes, const void *caller)
else
#endif
{
- if (oldchsize >= chnb)
+ /* Note the extra SIZE_SZ overhead. */
+ if (oldsize - SIZE_SZ >= chnb)
newmem = oldmem; /* do nothing */
else
{
@@ -340,7 +341,7 @@ realloc_check (void *oldmem, size_t bytes, const void *caller)
newmem = _int_malloc (&main_arena, rb);
if (newmem)
{
- memcpy (newmem, oldmem, oldchsize - CHUNK_HDR_SZ);
+ memcpy (newmem, oldmem, oldsize - CHUNK_HDR_SZ);
munmap_chunk (oldp);
}
}
@@ -349,7 +350,7 @@ realloc_check (void *oldmem, size_t bytes, const void *caller)
else
{
top_check ();
- newmem = _int_realloc (&main_arena, oldp, oldchsize, chnb);
+ newmem = _int_realloc (&main_arena, oldp, oldsize, chnb);
}
DIAG_PUSH_NEEDS_COMMENT;