]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Properly handle fencepost with MALLOC_ALIGN_MASK
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 24 Sep 2012 15:58:04 +0000 (08:58 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 24 Sep 2012 15:58:04 +0000 (08:58 -0700)
ChangeLog
NEWS
malloc/arena.c

index b8c492e058dd3e9ac3788faaed133df54e78e822..e3329b43593180583ac6b143fbf50ddf737def94 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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]
diff --git a/NEWS b/NEWS
index 84c05d5feddb7919fb9a547b07c0ed6f5dc6bccc..33f86a17168da028c41d1e50320d73b869323369 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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
index 97c0b909ccafd80ff1d70456667b069e15f0cccb..f24e76c4f6df4977fd092807e7350f2a3ac23cd5 100644 (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;