Skip to content

Commit

Permalink
Fix some bornheads
Browse files Browse the repository at this point in the history
  • Loading branch information
unak committed Dec 27, 2021
1 parent 9790f54 commit 4e007d7
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 13 deletions.
13 changes: 1 addition & 12 deletions include/ruby/win32.h
Expand Up @@ -813,18 +813,7 @@ extern int rb_w32_mprotect(void *, size_t, int);

#define mmap(a, l, p, f, d, o) rb_w32_mmap(a, l, p, f, d, o)
#define munmap(a, l) rb_w32_munmap(a, l)

static inline int
mprotect(void *addr, size_t len, int prot)
{
if (prot | PROT_EXEC) {
if (!FlushInstructionCache(GetCurrentProcess(), addr, len)) {
errno = rb_w32_map_errno(GetLastError());
return -1;
}
}
return 0;
}
#define mprotect(a, l, prot) rb_w32_mprotect(a, l, prot)

#if defined(__cplusplus)
#if 0
Expand Down
39 changes: 38 additions & 1 deletion win32/win32.c
Expand Up @@ -8209,14 +8209,25 @@ 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 */
errno = EINVAL;
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;
Expand All @@ -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;
}

0 comments on commit 4e007d7

Please sign in to comment.