Mercurial > pub > dyncall > dyncall
diff dyncallback/dyncall_alloc_wx_mmap.c @ 202:030fbb70aa1b
- changed allocwx code:
* to introduce a call allowing to switch the written page to be executable (e.g. using mprotect)
* changed mmap based code so page is always W^X
author | Tassilo Philipp |
---|---|
date | Mon, 20 Mar 2017 23:12:58 +0100 |
parents | a41bc98e101c |
children | 3f7c69fadfc3 |
line wrap: on
line diff
--- a/dyncallback/dyncall_alloc_wx_mmap.c Sun Mar 19 20:26:01 2017 +0100 +++ b/dyncallback/dyncall_alloc_wx_mmap.c Mon Mar 20 23:12:58 2017 +0100 @@ -41,7 +41,7 @@ #endif -int dcAllocWX(size_t size, void** pp) +DCerror dcAllocWX(size_t size, void** pp) { void* p; #if !defined(MAP_ANON) && defined(DC_UNIX) @@ -50,7 +50,7 @@ int fd = open("/dev/zero", O_RDWR); if(fd == -1) return -1; - p = mmap(0, size+sizeof(int), PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + p = mmap(0, size+sizeof(int), PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); if(p == MAP_FAILED) { close(fd); return -1; @@ -58,7 +58,7 @@ *(int*)p = fd; p += sizeof(int); #else - p = mmap(0, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); + p = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); if(p == MAP_FAILED) return -1; #endif @@ -67,6 +67,11 @@ return 0; } +DCerror dcInitExecWX(void* p, size_t size) +{ + return mprotect(p, size, PROT_READ|PROT_EXEC); +} + void dcFreeWX(void* p, size_t size) { #if !defined(MAP_ANON) && defined(DC_UNIX)