about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-10 17:42:20 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-10 17:42:20 +0200
commitf000951fc970708bfa0dd5d357a334b8cfc41eb0 (patch)
tree071be15bfd617ecbae9a3917bfd6c21ebf4fa933
parentedeac868d097f6954f3663db079721ae9003dd6c (diff)
downloadbox64-f000951fc970708bfa0dd5d357a334b8cfc41eb0.tar.gz
box64-f000951fc970708bfa0dd5d357a334b8cfc41eb0.zip
Fixed some issue with memory protection tracking
-rw-r--r--src/custommem.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/custommem.c b/src/custommem.c
index 8cd15f21..8424ea1b 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -708,11 +708,12 @@ void protectDBnolock(uintptr_t addr, uintptr_t size)
         }
         const uintptr_t ii = i&(MEMPROT_SIZE-1);
         uint8_t prot = kh_value(memprot, k)[ii];
-        if(!prot)
-            prot = PROT_READ | PROT_WRITE;    // comes from malloc & co, so should not be able to execute
-        kh_value(memprot, k)[ii] = prot|PROT_DYNAREC;
-        if(!(prot&PROT_DYNAREC))
+        if(!(prot&PROT_DYNAREC)) {
+            if(!prot)
+                prot = PROT_READ | PROT_WRITE;    // comes from malloc & co, so should not be able to execute
+            kh_value(memprot, k)[ii] = prot|PROT_DYNAREC;
             mprotect((void*)(i<<MEMPROT_SHIFT), 1<<MEMPROT_SHIFT, prot&~(PROT_WRITE|PROT_CUSTOM));
+        }
     }
 }
 
@@ -751,8 +752,8 @@ void unprotectDB(uintptr_t addr, size_t size)
         }
         const uintptr_t ii = i&(MEMPROT_SIZE-1);
         uint8_t prot = kh_value(memprot, k)[ii];
-        kh_value(memprot, k)[ii] = prot&~PROT_DYNAREC;
         if(prot&PROT_DYNAREC) {
+            kh_value(memprot, k)[ii] = prot&~PROT_DYNAREC;
             mprotect((void*)(i<<MEMPROT_SHIFT), 1<<MEMPROT_SHIFT, prot&~PROT_CUSTOM);
             cleanDBFromAddressRange((i<<MEMPROT_SHIFT), 1<<MEMPROT_SHIFT, 0);
         }