#include <unistd.h>
#include <string.h>
#include <stdio.h>
+#include <signal.h>
#include "lscpu.h"
}
static jmp_buf segv_handler_env;
+static sigset_t oset;
static void
segv_handler(__attribute__((__unused__)) int sig,
{
uint32_t eax, ebx, ecx, edx;
struct sigaction act, oact;
+ sigset_t set;
/*
* FIXME: Not reliable for non-root users. Note it works as expected if
* the signal. All this magic is needed because lscpu
* isn't supposed to require root privileges.
*/
- if (sigsetjmp(segv_handler_env, 1))
+ if (sigsetjmp(segv_handler_env, 1)) {
+ if (sigprocmask(SIG_SETMASK, &oset, NULL))
+ err(EXIT_FAILURE, _("cannot restore signal mask"));
return 0;
+ }
+
+ sigemptyset(&set);
+ sigaddset(&set, SIGSEGV);
+ if (sigprocmask(SIG_UNBLOCK, &set, &oset))
+ err(EXIT_FAILURE, _("cannot unblock signal"));
memset(&act, 0, sizeof(act));
act.sa_sigaction = segv_handler;
if (sigaction(SIGSEGV, &oact, NULL))
err(EXIT_FAILURE, _("cannot restore signal handler"));
+ if (sigprocmask(SIG_SETMASK, &oset, NULL))
+ err(EXIT_FAILURE, _("cannot restore signal mask"));
+
return eax != (uint32_t)-1 && ebx == VMWARE_BDOOR_MAGIC;
}