From: Vsevolod Stakhov Date: Thu, 15 Oct 2015 17:18:11 +0000 (+0100) Subject: Try to handle SIGILL properly. X-Git-Tag: 1.0.6~9 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=01a94d2edbdcc64b25ab94709b302725a1a6d58a;p=rspamd.git Try to handle SIGILL properly. Issue: #399 --- 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; }