about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-07-22 20:45:16 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-07-22 20:45:16 +0200
commit67c9378fb8568b6104979e158ed690e4c6d3bc04 (patch)
tree883eb19b91fb4fa22ca01724ad0408cc8c72af1b /src
parent7ab299b2465cda2b9fb0ce5c4014906cc7d20e31 (diff)
downloadbox64-67c9378fb8568b6104979e158ed690e4c6d3bc04.tar.gz
box64-67c9378fb8568b6104979e158ed690e4c6d3bc04.zip
Hacked wrapped ptrace to avoid crash when wine handle exception (and debug registers in general)
Diffstat (limited to 'src')
-rw-r--r--src/wrapped/generated/functions_list.txt4
-rw-r--r--src/wrapped/generated/wrappedlibctypes.h2
-rw-r--r--src/wrapped/generated/wrapper.c5
-rw-r--r--src/wrapped/generated/wrapper.h2
-rw-r--r--src/wrapped/wrappedlibc.c10
-rw-r--r--src/wrapped/wrappedlibc_private.h2
6 files changed, 19 insertions, 6 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 9219270a..7d5370fd 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -1083,7 +1083,6 @@
 #() lFipLL
 #() lFipLp
 #() lFippL
-#() lFuipp
 #() lFpili
 #() lFpilp
 #() lFpuip
@@ -1574,6 +1573,7 @@
 #() uFppppL
 #() uFppppp
 #() UFuiiii
+#() lFEuipp
 #() lFipili
 #() lFipLli
 #() lFipLlL
@@ -3930,6 +3930,8 @@ wrappedlibc:
   - __vsprintf_chk
   - scandir
   - scandir64
+- lFuipp:
+  - ptrace
 - vFpLLpp:
   - qsort_r
 - iFiippi:
diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h
index ec55e5bb..508a16f6 100644
--- a/src/wrapped/generated/wrappedlibctypes.h
+++ b/src/wrapped/generated/wrappedlibctypes.h
@@ -73,6 +73,7 @@ typedef int32_t (*iFpLpA_t)(void*, uintptr_t, void*, va_list);
 typedef int32_t (*iFppii_t)(void*, void*, int32_t, int32_t);
 typedef int32_t (*iFppiV_t)(void*, void*, int32_t, ...);
 typedef int32_t (*iFpppp_t)(void*, void*, void*, void*);
+typedef intptr_t (*lFuipp_t)(uint32_t, int32_t, void*, void*);
 typedef void (*vFpLLpp_t)(void*, uintptr_t, uintptr_t, void*, void*);
 typedef int32_t (*iFiippi_t)(int32_t, int32_t, void*, void*, int32_t);
 typedef int32_t (*iFiLLLL_t)(int32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
@@ -254,6 +255,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(__vsprintf_chk, iFpppp_t) \
 	GO(scandir, iFpppp_t) \
 	GO(scandir64, iFpppp_t) \
+	GO(ptrace, lFuipp_t) \
 	GO(qsort_r, vFpLLpp_t) \
 	GO(__fxstatat, iFiippi_t) \
 	GO(__fxstatat64, iFiippi_t) \
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 8852b3cf..91d491ea 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -1119,7 +1119,6 @@ typedef intptr_t (*lFipLl_t)(int32_t, void*, uintptr_t, intptr_t);
 typedef intptr_t (*lFipLL_t)(int32_t, void*, uintptr_t, uintptr_t);
 typedef intptr_t (*lFipLp_t)(int32_t, void*, uintptr_t, void*);
 typedef intptr_t (*lFippL_t)(int32_t, void*, void*, uintptr_t);
-typedef intptr_t (*lFuipp_t)(uint32_t, int32_t, void*, void*);
 typedef intptr_t (*lFpili_t)(void*, int32_t, intptr_t, int32_t);
 typedef intptr_t (*lFpilp_t)(void*, int32_t, intptr_t, void*);
 typedef intptr_t (*lFpuip_t)(void*, uint32_t, int32_t, void*);
@@ -1610,6 +1609,7 @@ typedef uint32_t (*uFppppu_t)(void*, void*, void*, void*, uint32_t);
 typedef uint32_t (*uFppppL_t)(void*, void*, void*, void*, uintptr_t);
 typedef uint32_t (*uFppppp_t)(void*, void*, void*, void*, void*);
 typedef uint64_t (*UFuiiii_t)(uint32_t, int32_t, int32_t, int32_t, int32_t);
+typedef intptr_t (*lFEuipp_t)(x64emu_t*, uint32_t, int32_t, void*, void*);
 typedef intptr_t (*lFipili_t)(int32_t, void*, int32_t, intptr_t, int32_t);
 typedef intptr_t (*lFipLli_t)(int32_t, void*, uintptr_t, intptr_t, int32_t);
 typedef intptr_t (*lFipLlL_t)(int32_t, void*, uintptr_t, intptr_t, uintptr_t);
@@ -4016,7 +4016,6 @@ void lFipLl(x64emu_t *emu, uintptr_t fcn) { lFipLl_t fn = (lFipLl_t)fcn; R_RAX=(
 void lFipLL(x64emu_t *emu, uintptr_t fcn) { lFipLL_t fn = (lFipLL_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (uintptr_t)R_RCX); }
 void lFipLp(x64emu_t *emu, uintptr_t fcn) { lFipLp_t fn = (lFipLp_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (void*)R_RCX); }
 void lFippL(x64emu_t *emu, uintptr_t fcn) { lFippL_t fn = (lFippL_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (uintptr_t)R_RCX); }
-void lFuipp(x64emu_t *emu, uintptr_t fcn) { lFuipp_t fn = (lFuipp_t)fcn; R_RAX=(intptr_t)fn((uint32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX); }
 void lFpili(x64emu_t *emu, uintptr_t fcn) { lFpili_t fn = (lFpili_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (intptr_t)R_RDX, (int32_t)R_RCX); }
 void lFpilp(x64emu_t *emu, uintptr_t fcn) { lFpilp_t fn = (lFpilp_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (intptr_t)R_RDX, (void*)R_RCX); }
 void lFpuip(x64emu_t *emu, uintptr_t fcn) { lFpuip_t fn = (lFpuip_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (uint32_t)R_RSI, (int32_t)R_RDX, (void*)R_RCX); }
@@ -4507,6 +4506,7 @@ void uFppppu(x64emu_t *emu, uintptr_t fcn) { uFppppu_t fn = (uFppppu_t)fcn; R_RA
 void uFppppL(x64emu_t *emu, uintptr_t fcn) { uFppppL_t fn = (uFppppL_t)fcn; R_RAX=(uint32_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (uintptr_t)R_R8); }
 void uFppppp(x64emu_t *emu, uintptr_t fcn) { uFppppp_t fn = (uFppppp_t)fcn; R_RAX=(uint32_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8); }
 void UFuiiii(x64emu_t *emu, uintptr_t fcn) { UFuiiii_t fn = (UFuiiii_t)fcn; R_RAX=fn((uint32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8); }
+void lFEuipp(x64emu_t *emu, uintptr_t fcn) { lFEuipp_t fn = (lFEuipp_t)fcn; R_RAX=(intptr_t)fn(emu, (uint32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX); }
 void lFipili(x64emu_t *emu, uintptr_t fcn) { lFipili_t fn = (lFipili_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (intptr_t)R_RCX, (int32_t)R_R8); }
 void lFipLli(x64emu_t *emu, uintptr_t fcn) { lFipLli_t fn = (lFipLli_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (intptr_t)R_RCX, (int32_t)R_R8); }
 void lFipLlL(x64emu_t *emu, uintptr_t fcn) { lFipLlL_t fn = (lFipLlL_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (intptr_t)R_RCX, (uintptr_t)R_R8); }
@@ -6758,7 +6758,6 @@ int isSimpleWrapper(wrapper_t fun) {
 	if (fun == &lFipLL) return 1;
 	if (fun == &lFipLp) return 1;
 	if (fun == &lFippL) return 1;
-	if (fun == &lFuipp) return 1;
 	if (fun == &lFpili) return 1;
 	if (fun == &lFpilp) return 1;
 	if (fun == &lFpuip) return 1;
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index 5ca6d94a..7d79fd63 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -1120,7 +1120,6 @@ void lFipLl(x64emu_t *emu, uintptr_t fnc);
 void lFipLL(x64emu_t *emu, uintptr_t fnc);
 void lFipLp(x64emu_t *emu, uintptr_t fnc);
 void lFippL(x64emu_t *emu, uintptr_t fnc);
-void lFuipp(x64emu_t *emu, uintptr_t fnc);
 void lFpili(x64emu_t *emu, uintptr_t fnc);
 void lFpilp(x64emu_t *emu, uintptr_t fnc);
 void lFpuip(x64emu_t *emu, uintptr_t fnc);
@@ -1611,6 +1610,7 @@ void uFppppu(x64emu_t *emu, uintptr_t fnc);
 void uFppppL(x64emu_t *emu, uintptr_t fnc);
 void uFppppp(x64emu_t *emu, uintptr_t fnc);
 void UFuiiii(x64emu_t *emu, uintptr_t fnc);
+void lFEuipp(x64emu_t *emu, uintptr_t fnc);
 void lFipili(x64emu_t *emu, uintptr_t fnc);
 void lFipLli(x64emu_t *emu, uintptr_t fnc);
 void lFipLlL(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index ff20404e..59953d9c 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -39,6 +39,7 @@
 #include <malloc.h>
 #include <getopt.h>
 #include <sys/prctl.h>
+#include <sys/ptrace.h>
 #undef LOG_INFO
 #undef LOG_DEBUG
 
@@ -2981,6 +2982,15 @@ 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)
+{
+    if(request == PTRACE_POKEUSER) {
+        // lets just ignore this for now!
+        return 0;
+    }
+    return ptrace(request, pid, addr, data);
+}
+
 // Backtrace stuff
 
 #include "elfs/elfdwarf_private.h"
diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h
index bcef070d..933178e5 100644
--- a/src/wrapped/wrappedlibc_private.h
+++ b/src/wrapped/wrappedlibc_private.h
@@ -1420,7 +1420,7 @@ GO(psignal, vFip)
 //GO(pthread_setcancelstate, 
 //GO(pthread_setcanceltype, 
 //GO(pthread_setschedparam, 
-GO(ptrace, lFuipp)
+GOM(ptrace, lFEuipp)
 GO(ptsname, pFi)
 GOW(ptsname_r, iFipL)
 //GO(__ptsname_r_chk,