diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-02-25 15:20:12 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-02-25 15:20:12 +0100 |
| commit | eb212cd27e104ce989e483536e8be6123c594255 (patch) | |
| tree | 3bba4e09eb731719cea36cbfdd75669c7d5788be | |
| parent | b604dd0bccce7cd56e3532bd083e33568f3ecf46 (diff) | |
| download | box64-eb212cd27e104ce989e483536e8be6123c594255.tar.gz box64-eb212cd27e104ce989e483536e8be6123c594255.zip | |
[DYNAREC] Small imrvment in managing memory protection
| -rw-r--r-- | src/custommem.c | 7 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 2 |
2 files changed, 5 insertions, 4 deletions
diff --git a/src/custommem.c b/src/custommem.c index b9abcc3d..e261b62f 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -968,11 +968,12 @@ void updateProtection(uintptr_t addr, size_t size, uint32_t prot) memprot[i].prot = newblock; } for (uintptr_t i=idx; i<=end; ++i) { - uint32_t dyn=(memprot[i>>16].prot[i&0xffff]&PROT_DYN); - uint32_t mapped=(memprot[i>>16].prot[i&0xffff]&PROT_MMAP); + uint32_t old_prot = memprot[i>>16].prot[i&0xffff]; + uint32_t dyn=(old_prot&PROT_DYN); + uint32_t mapped=(old_prot&PROT_MMAP); if(dyn && (prot&PROT_WRITE)) { // need to remove the write protection from this block dyn = PROT_DYNAREC; - mprotect((void*)(i<<MEMPROT_SHIFT), 1<<MEMPROT_SHIFT, prot&~(PROT_WRITE|PROT_MMAP)); + mprotect((void*)(i<<MEMPROT_SHIFT), 1<<MEMPROT_SHIFT, prot&~PROT_WRITE); } else if(dyn && !(prot&PROT_WRITE)) { dyn = PROT_DYNAREC_R; } diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 1b84ab7b..7d24f736 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2558,7 +2558,7 @@ EXPORT int my_mprotect(x64emu_t* emu, void *addr, unsigned long len, int prot) prot|=PROT_READ; // PROT_READ is implicit with PROT_WRITE on x86_64 int ret = mprotect(addr, len, prot); #ifdef DYNAREC - if(box64_dynarec) { + if(box64_dynarec && !ret) { if(prot& PROT_EXEC) addDBFromAddressRange((uintptr_t)addr, len); else |