diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-10-08 19:01:57 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-10-08 19:01:57 +0200 |
| commit | b2162ba263ed486e6db5c18b9be6ef5a7dc6011f (patch) | |
| tree | 360fe1733faad3daf6d60c4bf993e33d910e19b8 | |
| parent | aba40a936057650d97b0cfb5a05694faa93d6f45 (diff) | |
| download | box64-b2162ba263ed486e6db5c18b9be6ef5a7dc6011f.tar.gz box64-b2162ba263ed486e6db5c18b9be6ef5a7dc6011f.zip | |
Another small improvment for signal when running unreadable memory
| -rw-r--r-- | src/libtools/signals.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c index cfe1227a..731eaece 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -1033,6 +1033,15 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) { // sig==SIGSEGV || sig==SIGBUS || sig==SIGILL || sig==SIGABRT here! int log_minimum = (box64_showsegv)?LOG_NONE:((sig==SIGSEGV && my_context->is_sigaction[sig])?LOG_DEBUG:LOG_INFO); + JUMPBUFF signal_jmpbuf; + #ifdef ANDROID + #define SIG_JMPBUF signal_jmpbuf + #else + #define SIG_JMPBUF &signal_jmpbuf + #endif + int signal_jmpbuf_active = 0; + if(signal_jmpbuf_active) + longjmp(SIG_JMPBUF, 1); if((sig==SIGSEGV || sig==SIGBUS) && box64_quit) { printf_log(LOG_INFO, "Sigfault/Segbus while quitting, exiting silently\n"); exit(0); // Hack, segfault while quiting, exit silently @@ -1299,7 +1308,12 @@ exit(-1); if(!db && (sig==SIGSEGV) && ((uintptr_t)addr==x64pc-1)) x64pc--; if(log_minimum<=box64_log) { - x64name = getAddrFunctionName(x64pc); + signal_jmpbuf_active = 1; + if(sigsetjmp(SIG_JMPBUF, 1)) { + // segfault while gathering function name... + } else + x64name = getAddrFunctionName(x64pc); + signal_jmpbuf_active = 0; elfheader_t* elf = FindElfAddress(my_context, x64pc); if(elf) elfname = ElfName(elf); |