diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-11-22 13:17:06 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-11-22 13:17:06 +0100 |
| commit | 6318b592a3514f7c92c81c920966c64208e1f2ea (patch) | |
| tree | 8d020b5f7bd94fa3158cd1fffa6c515992a59824 /src/libtools | |
| parent | 2b7e7fe6f65588c7c693e9ae53854893c8b1ca65 (diff) | |
| download | box64-6318b592a3514f7c92c81c920966c64208e1f2ea.tar.gz box64-6318b592a3514f7c92c81c920966c64208e1f2ea.zip | |
Improve stack management on signal handler
Diffstat (limited to 'src/libtools')
| -rwxr-xr-x | src/libtools/signals.c | 23 |
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); } |