aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0045-handle-mremap-failure-in-realloc-of-mmap-serviced-al.patch
diff options
context:
space:
mode:
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.patch39
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
+