From 07f35d248c871b46894b23cc5a347017409a2a25 Mon Sep 17 00:00:00 2001 From: Jay McCarthy Date: Thu, 25 May 2017 13:38:33 -0400 Subject: [PATCH] Abort if munmap or protect_pages fails On Linux, munmap can fail when you run out of mappable regions. If protect_pages fails, then you can't install a write barrier --- racket/src/racket/gc2/vm_mmap.c | 5 ++++- racket/src/racket/gc2/vm_osx.c | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/racket/src/racket/gc2/vm_mmap.c b/racket/src/racket/gc2/vm_mmap.c index 5c5da23074..25a4295288 100644 --- a/racket/src/racket/gc2/vm_mmap.c +++ b/racket/src/racket/gc2/vm_mmap.c @@ -19,6 +19,7 @@ static void os_free_pages(void *p, size_t len) { if (munmap(p, len)) { GCPRINT(GCOUTF, "unmap failed: %lx, %ld, %d\n", (long)p, (long)len, errno); + abort(); } } @@ -51,8 +52,10 @@ static void *os_alloc_pages(size_t len) static void os_protect_pages(void *p, size_t len, int writeable) { - if (mprotect(p, len, (writeable ? (PROT_READ | PROT_WRITE) : PROT_READ))) + if (mprotect(p, len, (writeable ? (PROT_READ | PROT_WRITE) : PROT_READ))) { GCPRINT(GCOUTF, "mprotect failed: %lx, %ld, %d, %d\n", (long)p, (long)len, writeable, errno); + abort(); + } } #include "rlimit_heapsize.c" diff --git a/racket/src/racket/gc2/vm_osx.c b/racket/src/racket/gc2/vm_osx.c index a9b895482a..3a4365e369 100644 --- a/racket/src/racket/gc2/vm_osx.c +++ b/racket/src/racket/gc2/vm_osx.c @@ -219,6 +219,7 @@ static void os_protect_pages(void *p, size_t len, int writeable) if(retval != KERN_SUCCESS) { GCPRINT(GCOUTF, "WARNING: couldn't protect %li bytes of page %p%s\n", len, p, mach_error_string(retval)); + abort(); } }