about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <seebastien.chev@gmail.com>2023-10-20 17:33:34 +0200
committerptitSeb <seebastien.chev@gmail.com>2023-10-20 17:33:34 +0200
commit7372540fce848b69432e3201a0cac0c453f2eae8 (patch)
tree4723c27660329b4b6874e9c2b52288bb46089914 /src
parentceaa4bcac664f7cfc2651641bd453c803679ba3b (diff)
downloadbox64-7372540fce848b69432e3201a0cac0c453f2eae8.tar.gz
box64-7372540fce848b69432e3201a0cac0c453f2eae8.zip
Added some workaround for program that POKEUSER/PEEKUSER some drX value and expect the value to stick (for #930)
Diffstat (limited to 'src')
-rw-r--r--src/wrapped/wrappedlibc.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 06e68715..e35145c5 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2981,12 +2981,24 @@ EXPORT int my_semctl(int semid, int semnum, int cmd, union semun b)
     return ret;
 }
 
-EXPORT int my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, void* data)
+EXPORT const uint64_t userdata_sign = 0x1234598765ABCEF0;
+EXPORT uint32_t userdata[1024]; 
+
+EXPORT long my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, uint32_t* data)
 {
     if(request == PTRACE_POKEUSER) {
+        if(ptrace(PTRACE_PEEKDATA, pid, &userdata_sign, NULL)==userdata_sign  && (uintptr_t)addr < sizeof(userdata)) {
+            ptrace(PTRACE_POKEDATA, pid, addr+(uintptr_t)userdata, data);
+            return 0;
+        }
         // lets just ignore this for now!
         return 0;
     }
+    if(request == PTRACE_PEEKUSER) {
+        if(ptrace(PTRACE_PEEKDATA, pid, &userdata_sign, NULL)==userdata_sign  && (uintptr_t)addr < sizeof(userdata)) {
+            return ptrace(PTRACE_PEEKDATA, pid, addr+(uintptr_t)userdata, data);
+        }
+    }
     return ptrace(request, pid, addr, data);
 }