]> source.dussan.org Git - rspamd.git/commitdiff
Try to handle SIGILL properly.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 15 Oct 2015 17:18:11 +0000 (18:18 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 15 Oct 2015 17:18:11 +0000 (18:18 +0100)
Issue: #399

src/libcryptobox/cryptobox.c

index 2ecc707a7594cb3ec6e8b7c7d017059a71a51c63..5dffaff4eea769fd25ab468eaab6c04e20b0b2f5 100644 (file)
@@ -41,6 +41,7 @@
 #endif
 
 #include <signal.h>
+#include <setjmp.h>
 
 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;
 }