aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo Niemeyer <gustavo@niemeyer.net>2011-06-24 00:29:59 -0300
committerGustavo Niemeyer <gustavo@niemeyer.net>2011-06-24 00:29:59 -0300
commit65b036c38107ef805edc7734b705157a8d9d43bd (patch)
tree78983475b9353411b4dd74d8d42bd99c9f70c146
parentb4bab6f8b351630211b0617ac91fb532d6aaf16d (diff)
downloadgo-65b036c38107ef805edc7734b705157a8d9d43bd.tar.gz
go-65b036c38107ef805edc7734b705157a8d9d43bd.zip
runtime: don't use twice the memory with grsec-like kernels
grsec needs the FIXED flag to be provided to mmap, which works now. That said, when the allocation fails to be made in the specific address, we're still given back a writable page. This change will unmap that page to avoid using twice the amount of memory needed. It'd also be pretty easy to avoid the extra system calls once we detected that the flag is needed, but I'm not sure if that edge case is worth the effort. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/4634086
-rw-r--r--src/pkg/runtime/linux/mem.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/pkg/runtime/linux/mem.c b/src/pkg/runtime/linux/mem.c
index 38ca7e4a0f..ad0fac6d3f 100644
--- a/src/pkg/runtime/linux/mem.c
+++ b/src/pkg/runtime/linux/mem.c
@@ -91,6 +91,9 @@ runtime·SysMap(void *v, uintptr n)
if(p != v && addrspace_free(v, n)) {
// On some systems, mmap ignores v without
// MAP_FIXED, so retry if the address space is free.
+ if(p > (void*)4096) {
+ runtime·munmap(p, n);
+ }
p = runtime·mmap(v, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0);
}
if(p == (void*)ENOMEM)