From d6cb31e417a1f73fcd326de8534f6a3da0f2cc89 Mon Sep 17 00:00:00 2001
From: Raymond Toy <toy.raymond@gmail.com>
Date: Fri, 3 Feb 2012 19:47:29 -0800
Subject: [PATCH] Fix ticket:55.  Copy all of the sigmask instead of just a
 few.  This only affected linux which uses an array for the sigmask.

---
 src/lisp/interrupt.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/src/lisp/interrupt.c b/src/lisp/interrupt.c
index de17cee10..b6332f59b 100644
--- a/src/lisp/interrupt.c
+++ b/src/lisp/interrupt.c
@@ -169,6 +169,16 @@ interrupt_internal_error(HANDLER_ARGS, boolean continuable)
 	arch_skip_instruction(context);
 }
 
+static void
+copy_sigmask(sigset_t *dst, sigset_t *src)
+{
+#ifndef __linux__
+    *dst = *src;
+#else
+    memcpy(dst, src, NSIG / 8);
+#endif
+}
+
 void
 interrupt_handle_pending(os_context_t * context)
 {
@@ -190,11 +200,8 @@ interrupt_handle_pending(os_context_t * context)
 #endif
 	    undo_fake_foreign_function_call(context);
     }
-#ifndef __linux__
-    context->uc_sigmask = pending_mask;
-#else
-    memcpy(&context->uc_sigmask, &pending_mask, NSIG / LONG_BIT);
-#endif
+
+    copy_sigmask(&context->uc_sigmask, &pending_mask);
     sigemptyset(&pending_mask);
 
     if (pending_signal) {
@@ -300,7 +307,7 @@ setup_pending_signal(HANDLER_ARGS)
      *
      */
     pending_code.si_code = CODE(code);
-    pending_mask = ucontext->uc_sigmask;
+    copy_sigmask(&pending_mask, &ucontext->uc_sigmask);
     FILLBLOCKSET(&ucontext->uc_sigmask);
 }
 
@@ -372,11 +379,7 @@ interrupt_maybe_gc(HANDLER_ARGS)
 	if (arch_pseudo_atomic_atomic(context)) {
 	    maybe_gc_pending = TRUE;
 	    if (pending_signal == 0) {
-#ifndef __linux__
-		pending_mask = context->uc_sigmask;
-#else
-		memcpy(&pending_mask, &context->uc_sigmask, NSIG / LONG_BIT);
-#endif
+		copy_sigmask(&pending_mask, &context->uc_sigmask);
 		FILLBLOCKSET(&context->uc_sigmask);
 	    }
 	    arch_set_pseudo_atomic_interrupted(context);
-- 
GitLab