From a846f5e378a1c03ae122c711308899bbe381a7f1 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 13 Dec 2013 08:01:56 -0800 Subject: * signal.c (set_sig_handler): Disable signals around this function because it manipulates the mask of deferred signals which can also be manipulated by an async signal. --- ChangeLog | 6 ++++++ signal.c | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/ChangeLog b/ChangeLog index 44bc26cd..2d87676a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-12-13 Kaz Kylheku + + * signal.c (set_sig_handler): Disable signals around this + function because it manipulates the mask of deferred + signals which can also be manipulated by an async signal. + 2013-12-13 Kaz Kylheku * signal.c (set_sig_handler): Clear the deferred flag diff --git a/signal.c b/signal.c index c833131b..4a089caf 100644 --- a/signal.c +++ b/signal.c @@ -130,6 +130,10 @@ val set_sig_handler(val signo, val lambda) { cnum sig = c_num(signo); val old_lambda; + sigset_t block, saved; + + sigfillset(&block); + sigprocmask(SIG_BLOCK, &block, &saved); if (sig < 0 || sig >= MAX_SIG) uw_throwf(error_s, lit("set-sig-handler: signal ~s out of range\n"), sig, nao); @@ -159,6 +163,8 @@ val set_sig_handler(val signo, val lambda) sig_lambda[sig] = lambda; } + sigprocmask(SIG_SETMASK, &saved, 0); + return old_lambda; } -- cgit v1.2.3