about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-11-22 13:17:06 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-11-22 13:17:06 +0100
commit6318b592a3514f7c92c81c920966c64208e1f2ea (patch)
tree8d020b5f7bd94fa3158cd1fffa6c515992a59824 /src/libtools
parent2b7e7fe6f65588c7c693e9ae53854893c8b1ca65 (diff)
downloadbox64-6318b592a3514f7c92c81c920966c64208e1f2ea.tar.gz
box64-6318b592a3514f7c92c81c920966c64208e1f2ea.zip
Improve stack management on signal handler
Diffstat (limited to 'src/libtools')
-rwxr-xr-xsrc/libtools/signals.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index a2fdd188..657cdad3 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -371,7 +371,7 @@ EXPORT int my_sigaltstack(x64emu_t* emu, const x64_stack_t* ss, x64_stack_t* oss
         return -1;
     }
 	x64_stack_t *new_ss = (x64_stack_t*)pthread_getspecific(sigstack_key);
-    if(!ss) {
+    if(oss) {
         if(!new_ss) {
             oss->ss_flags = SS_DISABLE;
             oss->ss_sp = emu->init_stack;
@@ -381,6 +381,8 @@ EXPORT int my_sigaltstack(x64emu_t* emu, const x64_stack_t* ss, x64_stack_t* oss
             oss->ss_sp = new_ss->ss_sp;
             oss->ss_size = new_ss->ss_size;
         }
+    }
+    if(!ss) {
         return 0;
     }
     printf_log(LOG_DEBUG, "%04d|sigaltstack called ss=%p[flags=0x%x, sp=%p, ss=0x%lx], oss=%p\n", GetTID(), ss, ss->ss_flags, ss->ss_sp, ss->ss_size, oss);
@@ -397,19 +399,9 @@ EXPORT int my_sigaltstack(x64emu_t* emu, const x64_stack_t* ss, x64_stack_t* oss
         return 0;
     }
 
-    if(oss) {
-        if(!new_ss) {
-            oss->ss_flags = SS_DISABLE;
-            oss->ss_sp = emu->init_stack;
-            oss->ss_size = emu->size_stack;
-        } else {
-            oss->ss_flags = new_ss->ss_flags;
-            oss->ss_sp = new_ss->ss_sp;
-            oss->ss_size = new_ss->ss_size;
-        }
-    }
     if(!new_ss)
         new_ss = (x64_stack_t*)box_calloc(1, sizeof(x64_stack_t));
+    new_ss->ss_flags = 0;
     new_ss->ss_sp = ss->ss_sp;
     new_ss->ss_size = ss->ss_size;
 
@@ -576,7 +568,8 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void
         sigcontext->uc_stack.ss_sp = new_ss->ss_sp;
         sigcontext->uc_stack.ss_size = new_ss->ss_size;
         sigcontext->uc_stack.ss_flags = new_ss->ss_flags;
-    }
+    } else
+        sigcontext->uc_stack.ss_flags = SS_DISABLE;
     // Try to guess some X64_TRAPNO
     /*
     TRAP_x86_DIVIDE     = 0,   // Division by zero exception
@@ -648,6 +641,8 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void
     else
         ret = RunFunctionHandler(&exits, sigcontext, my_context->signals[sig], 3, sig, info2, sigcontext);
     // restore old value from emu
+    if(used_stack)  // release stack
+        new_ss->ss_flags = 0;
     #define GO(A) R_##A = old_##A
     GO(RAX);
     GO(RDI);
@@ -746,8 +741,6 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void
     }
     if(restorer)
         RunFunctionHandler(&exits, NULL, restorer, 0);
-    if(used_stack)  // release stack
-        new_ss->ss_flags = 0;
     relockMutex(Locks);
 }