malloc: Correct size computation in realloc for dumped fake mmapped chunks

For regular mmapped chunks there are two size fields (hence a reduction
by 2 * SIZE_SZ bytes), but for fake chunks, we only have one size field,
so we need to subtract SIZE_SZ bytes.

This was initially reported as Emacs bug 23726.
This commit is contained in:
Florian Weimer 2016-06-08 20:50:21 +02:00
parent 8fa8a330f9
commit 1e8a8875d6
2 changed files with 15 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2016-06-08 Florian Weimer <fweimer@redhat.com>
Emacs bug 23726.
* malloc/malloc.c (dumped_main_arena_start): Update comment.
(__libc_realloc): Correct size computation for dumped fake mmapped
chunks.
2016-06-07 Joseph Myers <joseph@codesourcery.com> 2016-06-07 Joseph Myers <joseph@codesourcery.com>
[BZ #20219] [BZ #20219]

View File

@ -1748,7 +1748,9 @@ static struct malloc_state main_arena =
/* These variables are used for undumping support. Chunked are marked /* These variables are used for undumping support. Chunked are marked
as using mmap, but we leave them alone if they fall into this as using mmap, but we leave them alone if they fall into this
range. */ range. NB: The chunk size for these chunks only includes the
initial size field (of SIZE_SZ bytes), there is no trailing size
field (unlike with regular mmapped chunks). */
static mchunkptr dumped_main_arena_start; /* Inclusive. */ static mchunkptr dumped_main_arena_start; /* Inclusive. */
static mchunkptr dumped_main_arena_end; /* Exclusive. */ static mchunkptr dumped_main_arena_end; /* Exclusive. */
@ -3029,9 +3031,11 @@ __libc_realloc (void *oldmem, size_t bytes)
if (newmem == 0) if (newmem == 0)
return NULL; return NULL;
/* Copy as many bytes as are available from the old chunk /* Copy as many bytes as are available from the old chunk
and fit into the new size. */ and fit into the new size. NB: The overhead for faked
if (bytes > oldsize - 2 * SIZE_SZ) mmapped chunks is only SIZE_SZ, not 2 * SIZE_SZ as for
bytes = oldsize - 2 * SIZE_SZ; regular mmapped chunks. */
if (bytes > oldsize - SIZE_SZ)
bytes = oldsize - SIZE_SZ;
memcpy (newmem, oldmem, bytes); memcpy (newmem, oldmem, bytes);
return newmem; return newmem;
} }