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)