Skip to content

Commit

Permalink
Unblock signal-mask on error for unsafe signals
Browse files Browse the repository at this point in the history
  • Loading branch information
Leont authored and Father Chrysostomos committed Feb 17, 2011
1 parent 3acb769 commit c22d665
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
16 changes: 14 additions & 2 deletions mg.c
Original file line number Diff line number Diff line change
Expand Up @@ -3106,15 +3106,27 @@ Perl_sighandler(int sig)

POPSTACK;
if (SvTRUE(ERRSV)) {
#if !defined(PERL_MICRO) && !defined(HAS_SIGPROCMASK)
#ifndef PERL_MICRO
/* Handler "died", for example to get out of a restart-able read().
* Before we re-do that on its behalf re-enable the signal which was
* blocked by the system when we entered.
*/
#ifdef HAS_SIGPROCMASK
#ifdef HAS_SIGACTION
if (sip)
#endif
{
sigset_t set;
sigemptyset(&set);
sigaddset(&set,sig);
sigprocmask(SIG_UNBLOCK, &set, NULL);
}
#else
/* Not clear if this will work */
(void)rsignal(sig, SIG_IGN);
(void)rsignal(sig, PL_csighandlerp);
#endif /* !PERL_MICRO && !HAS_SIGPROCMASK*/
#endif
#endif /* !PERL_MICRO */
die_sv(ERRSV);
}
cleanup:
Expand Down
8 changes: 7 additions & 1 deletion t/op/sigdispatch.t
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ BEGIN {
use strict;
use Config;

plan tests => 12;
plan tests => 13;

watchdog(10);

Expand Down Expand Up @@ -70,4 +70,10 @@ SKIP: {
POSIX::sigprocmask(&POSIX::SIG_UNBLOCK, $new, $old);
ok $old->ismember(&POSIX::SIGUSR1), 'SIGUSR1 was still blocked';
is $gotit, 2, 'Received fifth signal';

# test unsafe signal handlers in combination with exceptions
my $action = POSIX::SigAction->new(sub { $gotit--, die }, POSIX::SigSet->new, 0);
POSIX::sigaction(&POSIX::SIGUSR1, $action);
eval { kill SIGUSR1, $$ } for 1..2;
is $gotit, 0, 'Received both signals';
}

0 comments on commit c22d665

Please sign in to comment.