diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2012-09-24 08:58:04 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2012-09-24 08:58:04 -0700 |
commit | ced6f16ee919d12725840d43d007f1cfd67118df (patch) | |
tree | 2f861efcccd0eea5dde22744da6c6967ff300532 | |
parent | a9f8e53a5b14ba481999ded036b025554ea06362 (diff) | |
download | glibc-ced6f16ee919d12725840d43d007f1cfd67118df.zip glibc-ced6f16ee919d12725840d43d007f1cfd67118df.tar.gz glibc-ced6f16ee919d12725840d43d007f1cfd67118df.tar.bz2 |
Properly handle fencepost with MALLOC_ALIGN_MASK
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | malloc/arena.c | 10 |
3 files changed, 14 insertions, 4 deletions
@@ -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] @@ -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 diff --git a/malloc/arena.c b/malloc/arena.c index 97c0b90..f24e76c 100644 --- a/malloc/arena.c +++ b/malloc/arena.c @@ -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; |