aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2021-02-11 01:03:46 -0800
committerAndrew Waterman <andrew@sifive.com>2021-03-25 22:21:06 -0700
commit6c8e0fd96d8a88c77755ee49e320c741958f50ed (patch)
tree1f437f46af09532ccaeb703e3ddf3f2d1e8cf08a
parente63232e82d2355966d4a2eda523d7f51b760a805 (diff)
downloadriscv-pk-6c8e0fd96d8a88c77755ee49e320c741958f50ed.zip
riscv-pk-6c8e0fd96d8a88c77755ee49e320c741958f50ed.tar.gz
riscv-pk-6c8e0fd96d8a88c77755ee49e320c741958f50ed.tar.bz2
pk: avoid assertion failures on brk syscalls
Return the old brk if mmap fails, rather than just asserting out
-rw-r--r--pk/mmap.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/pk/mmap.c b/pk/mmap.c
index b0f6bf1..33f6d50 100644
--- a/pk/mmap.c
+++ b/pk/mmap.c
@@ -388,10 +388,12 @@ uintptr_t __do_brk(size_t addr)
current.brk = ROUNDUP(current.brk_min, RISCV_PGSIZE);
uintptr_t newbrk_page = ROUNDUP(newbrk, RISCV_PGSIZE);
- if (current.brk > newbrk_page)
+ if (current.brk > newbrk_page) {
__do_munmap(newbrk_page, current.brk - newbrk_page);
- else if (current.brk < newbrk_page)
- kassert(__do_mmap(current.brk, newbrk_page - current.brk, -1, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, 0, 0) == current.brk);
+ } else if (current.brk < newbrk_page) {
+ if (__do_mmap(current.brk, newbrk_page - current.brk, -1, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, 0, 0) != current.brk)
+ return current.brk;
+ }
current.brk = newbrk_page;
return newbrk;