From 01a94d2edbdcc64b25ab94709b302725a1a6d58a Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 15 Oct 2015 18:18:11 +0100 Subject: [PATCH] Try to handle SIGILL properly. Issue: #399 --- src/libcryptobox/cryptobox.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/libcryptobox/cryptobox.c b/src/libcryptobox/cryptobox.c index 2ecc707a7..5dffaff4e 100644 --- a/src/libcryptobox/cryptobox.c +++ b/src/libcryptobox/cryptobox.c @@ -41,6 +41,7 @@ #endif #include +#include unsigned long cpu_config = 0; @@ -92,11 +93,13 @@ rspamd_cryptobox_cpuid (gint cpu[4], gint info) } static sig_atomic_t ok = 0; +static jmp_buf j; static void rspamd_cryptobox_ill_handler (int signo) { ok = 0; + longjmp (j, -1); } static gboolean @@ -108,6 +111,12 @@ rspamd_cryptobox_test_instr (gint instr) ok = 1; old_handler = signal (SIGILL, rspamd_cryptobox_ill_handler); + if (setjmp (j) != 0) { + signal (SIGILL, old_handler); + + return FALSE; + } + switch (instr) { #ifdef HAVE_SSE2 case CPUID_SSE2: @@ -146,6 +155,7 @@ rspamd_cryptobox_test_instr (gint instr) signal (SIGILL, old_handler); #endif + /* We actually never return here if SIGILL has been caught */ return ok == 1; } -- 2.39.5