page-align initial brk value used by malloc in shared libc
authorRich Felker <dalias@aerifal.cx>
Sat, 8 Dec 2012 03:33:11 +0000 (22:33 -0500)
committerRich Felker <dalias@aerifal.cx>
Sat, 8 Dec 2012 03:33:11 +0000 (22:33 -0500)
this change fixes an obscure issue with some nonstandard kernels,
where the initial brk syscall returns a pointer just past the end of
bss rather than the beginning of a new page. in that case, the dynamic
linker has already reclaimed the space between the end of bss and the
page end for use by malloc, and memory corruption (allocating the same
memory twice) will occur when malloc again claims it on the first call
to brk.

src/malloc/malloc.c

index 88a31ae4f5b0293d3afb73c931f6d828f9d891c9..1a6d1493291c7ed2d816687d92d100b78c972137 100644 (file)
@@ -196,7 +196,11 @@ static int init_malloc(size_t n)
                return 0;
        }
 
-       mal.brk = __brk(0) + 2*SIZE_ALIGN-1 & -SIZE_ALIGN;
+       mal.brk = __brk(0);
+#ifdef SHARED
+       mal.brk = mal.brk + PAGE_SIZE-1 & -PAGE_SIZE;
+#endif
+       mal.brk = mal.brk + 2*SIZE_ALIGN-1 & -SIZE_ALIGN;
 
        c = expand_heap(n);