d8307d
commit c0e82f117357a941e4d40fcc08babbd6a3c3a1b5
d8307d
Author: Istvan Kurucsai <pistukem@gmail.com>
d8307d
Date:   Fri Dec 21 00:13:01 2018 -0500
d8307d
d8307d
    malloc: Check the alignment of mmapped chunks before unmapping.
d8307d
    
d8307d
    * malloc/malloc.c (munmap_chunk): Verify chunk alignment.
d8307d
d8307d
diff --git a/malloc/malloc.c b/malloc/malloc.c
d8307d
index 4df5cb4862a7b854..4412a4ffc83b013b 100644
d8307d
--- a/malloc/malloc.c
d8307d
+++ b/malloc/malloc.c
d8307d
@@ -2817,6 +2817,7 @@ systrim (size_t pad, mstate av)
d8307d
 static void
d8307d
 munmap_chunk (mchunkptr p)
d8307d
 {
d8307d
+  size_t pagesize = GLRO (dl_pagesize);
d8307d
   INTERNAL_SIZE_T size = chunksize (p);
d8307d
 
d8307d
   assert (chunk_is_mmapped (p));
d8307d
@@ -2826,6 +2827,7 @@ munmap_chunk (mchunkptr p)
d8307d
   if (DUMPED_MAIN_ARENA_CHUNK (p))
d8307d
     return;
d8307d
 
d8307d
+  uintptr_t mem = (uintptr_t) chunk2mem (p);
d8307d
   uintptr_t block = (uintptr_t) p - prev_size (p);
d8307d
   size_t total_size = prev_size (p) + size;
d8307d
   /* Unfortunately we have to do the compilers job by hand here.  Normally
d8307d
@@ -2833,7 +2835,8 @@ munmap_chunk (mchunkptr p)
d8307d
      page size.  But gcc does not recognize the optimization possibility
d8307d
      (in the moment at least) so we combine the two values into one before
d8307d
      the bit test.  */
d8307d
-  if (__builtin_expect (((block | total_size) & (GLRO (dl_pagesize) - 1)) != 0, 0))
d8307d
+  if (__glibc_unlikely ((block | total_size) & (pagesize - 1)) != 0
d8307d
+      || __glibc_unlikely (!powerof2 (mem & (pagesize - 1))))
d8307d
     malloc_printerr ("munmap_chunk(): invalid pointer");
d8307d
 
d8307d
   atomic_decrement (&mp_.n_mmaps);