aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-10-11 16:13:31 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-10-12 23:37:09 +0000
commit19e008e7f79ce55182d227be8513b3fa520471d8 (patch)
tree31b3de2d3dd74af95d99666c60e639e55047ecb6
parent0b72d2965d68113bce16f6cccea77257283ef0a7 (diff)
downloadsrc-19e008e7f79ce55182d227be8513b3fa520471d8.tar.gz
src-19e008e7f79ce55182d227be8513b3fa520471d8.zip
crt_malloc: Be more persistent when handling mmap() failure
In the situation with limited address space, together with fragmentation, it is possible for mmap() request in morecore() to fail when asking for required size + NPOOLPAGES, but succeed without the addend. Retry allocation there. PR: 259076 Reported by: Denis Koreshkov <dynamic-wind@mail.ru> Reviewed by: arichardson Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D32474
-rw-r--r--libexec/rtld-elf/rtld_malloc.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/libexec/rtld-elf/rtld_malloc.c b/libexec/rtld-elf/rtld_malloc.c
index f22c3c727c73..64218b5bb786 100644
--- a/libexec/rtld-elf/rtld_malloc.c
+++ b/libexec/rtld-elf/rtld_malloc.c
@@ -184,7 +184,9 @@ morecore(int bucket)
nblks = 1;
}
if (amt > pagepool_end - pagepool_start)
- if (morepages(amt/pagesz + NPOOLPAGES) == 0)
+ if (morepages(amt / pagesz + NPOOLPAGES) == 0 &&
+ /* Retry with min required size */
+ morepages(amt / pagesz) == 0)
return;
op = (union overhead *)pagepool_start;
pagepool_start += amt;
@@ -269,6 +271,8 @@ morepages(int n)
}
}
+ if (pagepool_start == MAP_FAILED)
+ pagepool_start = 0;
offset = (uintptr_t)pagepool_start - rounddown2(
(uintptr_t)pagepool_start, pagesz);