Properly handle fencepost with MALLOC_ALIGN_MASK

This commit is contained in:
H.J. Lu 2012-09-24 08:58:04 -07:00
parent a9f8e53a5b
commit ced6f16ee9
3 changed files with 14 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2012-09-24 H.J. Lu <hongjiu.lu@intel.com>
[BZ #14562]
* malloc/arena.c (heap_trim): Properly get fencepost and adjust
new chunk size with MALLOC_ALIGN_MASK.
2012-09-24 Joseph Myers <joseph@codesourcery.com>
[BZ #5044]

2
NEWS
View File

@ -14,7 +14,7 @@ Version 2.17
14151, 14154, 14157, 14166, 14173, 14195, 14237, 14252, 14283, 14298,
14303, 14307, 14328, 14331, 14336, 14337, 14347, 14349, 14459, 14476,
14505, 14510, 14516, 14518, 14519, 14532, 14538, 14544, 14545, 14576,
14579, 14583, 14587.
14579, 14583, 14587, 14562.
* Support for STT_GNU_IFUNC symbols added for s390 and s390x.
Optimized versions of memcpy, memset, and memcmp added for System z10 and

View File

@ -655,15 +655,19 @@ heap_trim(heap_info *heap, size_t pad)
unsigned long pagesz = GLRO(dl_pagesize);
mchunkptr top_chunk = top(ar_ptr), p, bck, fwd;
heap_info *prev_heap;
long new_size, top_size, extra;
long new_size, top_size, extra, prev_size, misalign;
/* Can this heap go away completely? */
while(top_chunk == chunk_at_offset(heap, sizeof(*heap))) {
prev_heap = heap->prev;
p = chunk_at_offset(prev_heap, prev_heap->size - (MINSIZE-2*SIZE_SZ));
prev_size = prev_heap->size - (MINSIZE-2*SIZE_SZ);
p = chunk_at_offset(prev_heap, prev_size);
/* fencepost must be properly aligned. */
misalign = ((long) p) & MALLOC_ALIGN_MASK;
p = chunk_at_offset(prev_heap, prev_size - misalign);
assert(p->size == (0|PREV_INUSE)); /* must be fencepost */
p = prev_chunk(p);
new_size = chunksize(p) + (MINSIZE-2*SIZE_SZ);
new_size = chunksize(p) + (MINSIZE-2*SIZE_SZ) + misalign;
assert(new_size>0 && new_size<(long)(2*MINSIZE));
if(!prev_inuse(p))
new_size += p->prev_size;