diff options
Diffstat (limited to 'main/musl/0045-handle-mremap-failure-in-realloc-of-mmap-serviced-al.patch')
-rw-r--r-- | main/musl/0045-handle-mremap-failure-in-realloc-of-mmap-serviced-al.patch | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/main/musl/0045-handle-mremap-failure-in-realloc-of-mmap-serviced-al.patch b/main/musl/0045-handle-mremap-failure-in-realloc-of-mmap-serviced-al.patch new file mode 100644 index 0000000000..b5c86231d1 --- /dev/null +++ b/main/musl/0045-handle-mremap-failure-in-realloc-of-mmap-serviced-al.patch @@ -0,0 +1,39 @@ +From 1c86c7f5c26dd0569df7afc23ee9866fb3f645dc Mon Sep 17 00:00:00 2001 +From: Rich Felker <dalias@aerifal.cx> +Date: Thu, 15 Jun 2017 12:54:40 -0400 +Subject: [PATCH] handle mremap failure in realloc of mmap-serviced allocations + +mremap seems to always fail on nommu, and on some non-Linux +implementations of the Linux syscall API, it at least fails to +increase allocation size, and may fail to move (i.e. defragment) the +existing mapping when shrinking it too. instead of failing realloc or +leaving an over-sized allocation that may waste a large amount of +memory, fallback to malloc-memcpy-free if mremap fails. +--- + src/malloc/malloc.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c +index c38c46fe..d5ee4280 100644 +--- a/src/malloc/malloc.c ++++ b/src/malloc/malloc.c +@@ -406,7 +406,7 @@ void *realloc(void *p, size_t n) + if (oldlen == newlen) return p; + base = __mremap(base, oldlen, newlen, MREMAP_MAYMOVE); + if (base == (void *)-1) +- return newlen < oldlen ? p : 0; ++ goto copy_realloc; + self = (void *)(base + extra); + self->csize = newlen - extra; + return CHUNK_TO_MEM(self); +@@ -439,6 +439,7 @@ void *realloc(void *p, size_t n) + return CHUNK_TO_MEM(self); + } + ++copy_realloc: + /* As a last resort, allocate a new chunk and copy to it. */ + new = malloc(n-OVERHEAD); + if (!new) return 0; +-- +2.13.0 + |