diff options
| author | wannacu <wannacu2049@gmail.com> | 2022-07-01 15:18:05 +0800 |
|---|---|---|
| committer | wannacu <wannacu2049@gmail.com> | 2022-07-01 15:18:05 +0800 |
| commit | 9eeaaf0a03b494f0e44ae3c2c2d4a605e4a49638 (patch) | |
| tree | bcb2a66e73c7e0fed52e941179bc8a2059996881 /src | |
| parent | 9328ba79d19c07faa2634ea9bc06e0d400c58edd (diff) | |
| download | box64-9eeaaf0a03b494f0e44ae3c2c2d4a605e4a49638.tar.gz box64-9eeaaf0a03b494f0e44ae3c2c2d4a605e4a49638.zip | |
Align address when call mprotect
Diffstat (limited to 'src')
| -rwxr-xr-x | src/elfs/elfloader.c | 5 |
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) { |