From 4f8392f633cbd3b978c05b972983cfef82be4e7b Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 24 Jul 2021 16:11:16 -0700 Subject: [PATCH 4/4] Port recent Gnulib changes to MS-Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * nt/gnulib-cfg.mk (OMIT_GNULIB_MODULE_free-posix) (OMIT_GNULIB_MODULE_malloc-posix) (OMIT_GNULIB_MODULE_realloc-gnu) (OMIT_GNULIB_MODULE_realloc-posix): New macros, since we don’t want these modules on MS-Windows. * src/w32heap.c (heap_alloc, heap_realloc): New functions. (malloc_after_dump, realloc_after_dump, realloc_before_dump): Use them. --- nt/gnulib-cfg.mk | 4 ++++ src/w32heap.c | 42 ++++++++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/nt/gnulib-cfg.mk b/nt/gnulib-cfg.mk index c85b9150f0..f1f4c4c279 100644 --- a/nt/gnulib-cfg.mk +++ b/nt/gnulib-cfg.mk @@ -49,10 +49,14 @@ OMIT_GNULIB_MODULE_dirent = OMIT_GNULIB_MODULE_dirfd = true OMIT_GNULIB_MODULE_fcntl = true OMIT_GNULIB_MODULE_fcntl-h = true +OMIT_GNULIB_MODULE_free-posix = true OMIT_GNULIB_MODULE_fsusage = true OMIT_GNULIB_MODULE_inttypes-incomplete = true +OMIT_GNULIB_MODULE_malloc-posix = true OMIT_GNULIB_MODULE_open = true OMIT_GNULIB_MODULE_pipe2 = true +OMIT_GNULIB_MODULE_realloc-gnu = true +OMIT_GNULIB_MODULE_realloc-posix = true OMIT_GNULIB_MODULE_secure_getenv = true OMIT_GNULIB_MODULE_signal-h = true OMIT_GNULIB_MODULE_stdio = true diff --git a/src/w32heap.c b/src/w32heap.c index 0f228bfb22..a0d4c070be 100644 --- a/src/w32heap.c +++ b/src/w32heap.c @@ -189,6 +189,26 @@ #define MAX_BLOCKS 0x40 realloc_fn the_realloc_fn; free_fn the_free_fn; +static void * +heap_alloc (size_t size) +{ + void *p = size <= PTRDIFF_MAX ? HeapAlloc (heap, 0, size | !size) : NULL; + if (!p) + errno = ENOMEM; + return p; +} + +static void * +heap_realloc (void *ptr, size_t size) +{ + void *p = (size <= PTRDIFF_MAX + ? HeapReAlloc (heap, 0, ptr, size | !size) + : NULL); + if (!p) + errno = ENOMEM; + return p; +} + /* It doesn't seem to be useful to allocate from a file mapping. It would be if the memory was shared. https://stackoverflow.com/questions/307060/what-is-the-purpose-of-allocating-pages-in-the-pagefile-with-createfilemapping */ @@ -346,7 +366,7 @@ #define FREEABLE_P(addr) \ malloc_after_dump (size_t size) { /* Use the new private heap. */ - void *p = HeapAlloc (heap, 0, size); + void *p = heap_alloc (size); /* After dump, keep track of the "brk value" for sbrk(0). */ if (p) @@ -356,8 +376,6 @@ malloc_after_dump (size_t size) if (new_brk > data_region_end) data_region_end = new_brk; } - else - errno = ENOMEM; return p; } @@ -373,9 +391,7 @@ malloc_before_dump (size_t size) if (size < MaxBlockSize) { /* Use the private heap if possible. */ - p = HeapAlloc (heap, 0, size); - if (!p) - errno = ENOMEM; + p = heap_alloc (size); } else { @@ -433,18 +449,14 @@ realloc_after_dump (void *ptr, size_t size) if (FREEABLE_P (ptr)) { /* Reallocate the block since it lies in the new heap. */ - p = HeapReAlloc (heap, 0, ptr, size); - if (!p) - errno = ENOMEM; + p = heap_realloc (ptr, size); } else { /* If the block lies in the dumped data, do not free it. Only allocate a new one. */ - p = HeapAlloc (heap, 0, size); - if (!p) - errno = ENOMEM; - else if (ptr) + p = heap_alloc (size); + if (p && ptr) CopyMemory (p, ptr, size); } /* After dump, keep track of the "brk value" for sbrk(0). */ @@ -467,9 +479,7 @@ realloc_before_dump (void *ptr, size_t size) if (dumped_data < (unsigned char *)ptr && (unsigned char *)ptr < bc_limit && size <= MaxBlockSize) { - p = HeapReAlloc (heap, 0, ptr, size); - if (!p) - errno = ENOMEM; + p = heap_realloc (ptr, size); } else { -- 2.31.1