From 224532d66198c80c89b6017e14de4bbed53e305e Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Wed, 3 Oct 2018 14:19:59 +0100 Subject: fix handling of failing external calls Currently KLEE only handles the first segfault in external calls as it doesn't unblock SIGSEGV afterwards. This patch unblocks the signal and enables handling of multiple failing calls. --- lib/Core/ExternalDispatcher.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'lib/Core') diff --git a/lib/Core/ExternalDispatcher.cpp b/lib/Core/ExternalDispatcher.cpp index c8ebf38a..60bdf711 100644 --- a/lib/Core/ExternalDispatcher.cpp +++ b/lib/Core/ExternalDispatcher.cpp @@ -34,20 +34,20 @@ #include "llvm/IR/CallSite.h" #endif -#include -#include +#include +#include using namespace llvm; using namespace klee; /***/ -static jmp_buf escapeCallJmpBuf; +static sigjmp_buf escapeCallJmpBuf; extern "C" { static void sigsegv_handler(int signal, siginfo_t *info, void *context) { - longjmp(escapeCallJmpBuf, 1); + siglongjmp(escapeCallJmpBuf, 1); } } @@ -249,13 +249,14 @@ bool ExternalDispatcherImpl::runProtectedCall(Function *f, uint64_t *args) { std::vector gvArgs; gTheArgsP = args; - segvAction.sa_handler = 0; - memset(&segvAction.sa_mask, 0, sizeof(segvAction.sa_mask)); + segvAction.sa_handler = nullptr; + sigemptyset(&(segvAction.sa_mask)); + sigaddset(&(segvAction.sa_mask), SIGSEGV); segvAction.sa_flags = SA_SIGINFO; segvAction.sa_sigaction = ::sigsegv_handler; sigaction(SIGSEGV, &segvAction, &segvActionOld); - if (setjmp(escapeCallJmpBuf)) { + if (sigsetjmp(escapeCallJmpBuf, 1)) { res = false; } else { errno = lastErrno; @@ -265,7 +266,7 @@ bool ExternalDispatcherImpl::runProtectedCall(Function *f, uint64_t *args) { res = true; } - sigaction(SIGSEGV, &segvActionOld, 0); + sigaction(SIGSEGV, &segvActionOld, nullptr); return res; } -- cgit 1.4.1