diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-10-16 13:57:37 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-10-16 14:21:54 +0200 |
| commit | c2337c94bffa1e752c0523c3c7d46522d317e238 (patch) | |
| tree | ac45636efd0c4e2f7cb72df5c9f47e4aac1acc4f /pkg/csource | |
| parent | 85b1f93f8dbbc767c564e494a6353aa3517d5d49 (diff) | |
executor: fix akaros nonfailing mode
Diffstat (limited to 'pkg/csource')
| -rw-r--r-- | pkg/csource/akaros_common.go | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/pkg/csource/akaros_common.go b/pkg/csource/akaros_common.go index 74e7e310b..669020aa8 100644 --- a/pkg/csource/akaros_common.go +++ b/pkg/csource/akaros_common.go @@ -19,6 +19,7 @@ var commonHeaderAkaros = ` #include <time.h> #endif #if defined(SYZ_EXECUTOR) || defined(SYZ_HANDLE_SEGV) +#include <parlib/parlib.h> #include <setjmp.h> #include <signal.h> #endif @@ -194,6 +195,11 @@ static uint16_t csum_inet_digest(struct csum_inet* csum) static __thread int skip_segv; static __thread jmp_buf segv_env; +static void recover() +{ + _longjmp(segv_env, 1); +} + static void segv_handler(int sig, siginfo_t* info, void* ctx) { uintptr_t addr = (uintptr_t)info->si_addr; @@ -201,7 +207,9 @@ static void segv_handler(int sig, siginfo_t* info, void* ctx) const uintptr_t prog_end = 100 << 20; if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED) && (addr < prog_start || addr > prog_end)) { debug("SIGSEGV on %p, skipping\n", addr); - siglongjmp(segv_env, 1); + struct user_context* uctx = (struct user_context*)ctx; + uctx->tf.hw_tf.tf_rip = (long)(void*)recover; + return; } debug("SIGSEGV on %p, exiting\n", addr); doexit(sig); |
