about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorwannacu <wannacu2049@gmail.com>2022-07-01 15:18:05 +0800
committerwannacu <wannacu2049@gmail.com>2022-07-01 15:18:05 +0800
commit9eeaaf0a03b494f0e44ae3c2c2d4a605e4a49638 (patch)
treebcb2a66e73c7e0fed52e941179bc8a2059996881 /src
parent9328ba79d19c07faa2634ea9bc06e0d400c58edd (diff)
downloadbox64-9eeaaf0a03b494f0e44ae3c2c2d4a605e4a49638.tar.gz
box64-9eeaaf0a03b494f0e44ae3c2c2d4a605e4a49638.zip
Align address when call mprotect
Diffstat (limited to 'src')
-rwxr-xr-xsrc/elfs/elfloader.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index 8b46ad3c..07328726 100755
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -354,8 +354,9 @@ int ReloadElfMemory(FILE* f, box64context_t* context, elfheader_t* head)
             #ifdef DYNAREC
             cleanDBFromAddressRange((uintptr_t)dest, e->p_memsz, 0);
             #endif
-            mprotect(dest, e->p_memsz, PROT_READ | PROT_WRITE | PROT_EXEC);
-            setProtection((uintptr_t)dest, e->p_memsz, PROT_READ | PROT_WRITE | PROT_EXEC);
+            uint32_t page_offset = (uintptr_t)dest & (box64_pagesize - 1);
+            mprotect(dest - page_offset, e->p_memsz + page_offset, PROT_READ | PROT_WRITE | PROT_EXEC);
+            setProtection((uintptr_t)dest - page_offset, e->p_memsz + page_offset, PROT_READ | PROT_WRITE | PROT_EXEC);
             if(e->p_filesz) {
                 ssize_t r = -1;
                 if((r=fread(dest, e->p_filesz, 1, f))!=1) {