summaryrefslogtreecommitdiff
path: root/win32/win32.c
diff options
context:
space:
mode:
authorU.Nakamura <usa@ruby-lang.org>2021-12-27 17:15:09 +0900
committerU.Nakamura <usa@ruby-lang.org>2021-12-27 17:15:09 +0900
commit4e007d705c7879a843cba4ef9d4bea8a422de3f9 (patch)
tree2a2549341efa1bc5e20dc8fbebdd9df1ff42692c /win32/win32.c
parent9790f54bff387b57579dc6f588bc29735eeae85b (diff)
downloadruby-4e007d705c7879a843cba4ef9d4bea8a422de3f9.tar.gz
Fix some bornheads
Diffstat (limited to 'win32/win32.c')
-rw-r--r--win32/win32.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/win32/win32.c b/win32/win32.c
index 889046ceaa..c9bd18c8cd 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -8209,6 +8209,8 @@ void *
rb_w32_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
{
void *ptr;
+ //DWORD protect = 0;
+ DWORD protect = PAGE_EXECUTE_READWRITE;
if (fd > 0 || offset) {
/* not supported */
@@ -8216,7 +8218,16 @@ rb_w32_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
return MAP_FAILED;
}
- ptr = VirtualAlloc(addr, len, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+/*
+ if (prot & PROT_EXEC) {
+ if (prot & PROT_WRITE) protect = PAGE_EXECUTE_READWRITE;
+ else if (prot & PROT_READ) protect = PAGE_EXECUTE_READ;
+ else protect = PAGE_EXECUTE;
+ }
+ else if (prot & PROT_WRITE) protect = PAGE_READWRITE;
+ else if (prot & PROT_READ) protect = PAGE_READONLY;
+*/
+ ptr = VirtualAlloc(addr, len, MEM_RESERVE | MEM_COMMIT, protect);
if (!ptr) {
errno = rb_w32_map_errno(GetLastError());
return MAP_FAILED;
@@ -8235,3 +8246,29 @@ rb_w32_munmap(void *addr, size_t len)
return 0;
}
+
+inline int
+rb_w32_mprotect(void *addr, size_t len, int prot)
+{
+/*
+ DWORD protect = 0;
+ if (prot & PROT_EXEC) {
+ if (prot & PROT_WRITE) protect = PAGE_EXECUTE_READWRITE;
+ else if (prot & PROT_READ) protect = PAGE_EXECUTE_READ;
+ else protect = PAGE_EXECUTE;
+ }
+ else if (prot & PROT_WRITE) protect = PAGE_READWRITE;
+ else if (prot & PROT_READ) protect = PAGE_READONLY;
+ if (!VirtualProtect(addr, len, protect, NULL)) {
+ errno = rb_w32_map_errno(GetLastError());
+ return -1;
+ }
+*/
+ if (prot | PROT_EXEC) {
+ if (!FlushInstructionCache(GetCurrentProcess(), addr, len)) {
+ errno = rb_w32_map_errno(GetLastError());
+ return -1;
+ }
+ }
+ return 0;
+}