From af3d5405b8d7b00c121643d7a0c0b9bb31cc7139 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 29 Jun 2011 00:42:42 -0400 Subject: work around linux bug in mprotect per POSIX: The mprotect() function shall change the access protections to be that specified by prot for those whole pages containing any part of the address space of the process starting at address addr and continuing for len bytes. on the other hand, linux mprotect fails with EINVAL if the base address and/or length is not page-aligned, so we have to align them before making the syscall. --- src/mman/mprotect.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/mman/mprotect.c') diff --git a/src/mman/mprotect.c b/src/mman/mprotect.c index 1db2aea2..5ab2d8b0 100644 --- a/src/mman/mprotect.c +++ b/src/mman/mprotect.c @@ -1,7 +1,11 @@ #include +#include #include "syscall.h" int mprotect(void *addr, size_t len, int prot) { - return syscall(SYS_mprotect, addr, len, prot); + size_t start, end; + start = (size_t)addr & -PAGE_SIZE; + end = (size_t)((char *)addr + len + PAGE_SIZE-1) & -PAGE_SIZE; + return syscall(SYS_mprotect, start, end-start, prot); } -- cgit v1.2.3-70-g09d2