--- emacs-24.3.orig/src/alloc.c +++ emacs-24.3/src/alloc.c @@ -47,6 +47,13 @@ #include +static void *initial_brk; +__attribute__((__constructor__)) +static void init() +{ + initial_brk = sbrk(0); +} + /* GC_CHECK_MARKED_OBJECTS means do sanity checks on allocated objects. Doable only if GC_MARK_STACK. */ #if ! GC_MARK_STACK @@ -699,6 +706,14 @@ { void *val; + if (block && block < initial_brk) { + size_t len = (char *)initial_brk - (char *)block; + if (len > size) len = size; + void *p = xmalloc(size); + memcpy(p, block, len); + return p; + } + MALLOC_BLOCK_INPUT; /* We must call malloc explicitly when BLOCK is 0, since some reallocs don't do this. */ @@ -720,6 +735,7 @@ void xfree (void *block) { + if (block < initial_brk) return; if (!block) return; MALLOC_BLOCK_INPUT; @@ -910,6 +926,7 @@ static void lisp_free (void *block) { + if (block < initial_brk) return; MALLOC_BLOCK_INPUT; free (block); #if GC_MARK_STACK && !defined GC_MALLOC_CHECK @@ -1117,6 +1134,8 @@ { struct ablock *ablock = block; struct ablocks *abase = ABLOCK_ABASE (ablock); + + if (block < initial_brk) return; MALLOC_BLOCK_INPUT; #if GC_MARK_STACK && !defined GC_MALLOC_CHECK