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.
This commit is contained in:
Eli Zaretskii 2015-07-27 21:16:46 +03:00
parent 3266513eb7
commit 094d5e9ef0

View file

@ -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)