From 094d5e9ef0fac319816c00cc52e0a0f2ef41be37 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 27 Jul 2015 21:16:46 +0300 Subject: [PATCH] Handle NULL pointers in w32heap.c allocation routines * src/w32heap.c (FREEABLE_P): Consider a NULL pointer "not freeable". (realloc_after_dump, realloc_before_dump, free_before_dump): Handle NULL pointers gracefully, as Emacs now seems to expect that. --- src/w32heap.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/w32heap.c b/src/w32heap.c index ec5b04119bf..60afd1d3174 100644 --- a/src/w32heap.c +++ b/src/w32heap.c @@ -305,9 +305,10 @@ init_heap (void) #undef free /* FREEABLE_P checks if the block can be safely freed. */ -#define FREEABLE_P(addr) \ - ((unsigned char *)(addr) < dumped_data \ - || (unsigned char *)(addr) >= dumped_data + DUMPED_HEAP_SIZE) +#define FREEABLE_P(addr) \ + ((unsigned char *)(addr) > 0 \ + && ((unsigned char *)(addr) < dumped_data \ + || (unsigned char *)(addr) >= dumped_data + DUMPED_HEAP_SIZE)) void * malloc_after_dump (size_t size) @@ -407,10 +408,10 @@ realloc_after_dump (void *ptr, size_t size) /* If the block lies in the dumped data, do not free it. Only allocate a new one. */ p = HeapAlloc (heap, 0, size); - if (p) - CopyMemory (p, ptr, size); - else + if (!p) errno = ENOMEM; + else if (ptr) + CopyMemory (p, ptr, size); } /* After dump, keep track of the "brk value" for sbrk(0). */ if (p) @@ -449,7 +450,7 @@ realloc_before_dump (void *ptr, size_t size) of failing the call as below. But this doesn't seem to be worth the added complexity, as loadup allocates only a very small number of large blocks, and never reallocates them. */ - if (p) + if (p && ptr) { CopyMemory (p, ptr, size); free_before_dump (ptr); @@ -473,6 +474,9 @@ free_after_dump (void *ptr) void free_before_dump (void *ptr) { + if (!ptr) + return; + /* Before dumping. */ if (dumped_data < (unsigned char *)ptr && (unsigned char *)ptr < bc_limit) -- 2.39.2