summaryrefslogtreecommitdiff
path: root/signal.c
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-11 21:23:58 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-11 21:23:58 +0000
commitf0a2b08d02e9e439e8d700f49e6a348b2d3ee9e0 (patch)
treedd6e9f93e93e8b518e759a5bb29a5cf8cb587577 /signal.c
parent9765712cd5762ff9dcc302de58804f5c140084b8 (diff)
merges r30919 from trunk into ruby_1_9_2.
-- * signal.c (sig_trap): avoid pthread_sigmask(xx, &mask, &mask) usage because FreeBSD don't permit it. If it's used, it behave as pthread_sigmask(xx, NULL, &mask). * signal.c (init_sigchld): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@31519 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/signal.c b/signal.c
index ba3595454a..f952659657 100644
--- a/signal.c
+++ b/signal.c
@@ -953,11 +953,15 @@ sig_trap(int argc, VALUE *argv)
rb_raise(rb_eSecurityError, "Insecure: tainted signal trap");
}
#if USE_TRAP_MASK
- /* disable interrupt */
- sigfillset(&arg.mask);
- pthread_sigmask(SIG_BLOCK, &arg.mask, &arg.mask);
+ {
+ sigset_t fullmask;
- return rb_ensure(trap, (VALUE)&arg, trap_ensure, (VALUE)&arg);
+ /* disable interrupt */
+ sigfillset(&fullmask);
+ pthread_sigmask(SIG_BLOCK, &fullmask, &arg.mask);
+
+ return rb_ensure(trap, (VALUE)&arg, trap_ensure, (VALUE)&arg);
+ }
#else
return trap(&arg);
#endif
@@ -1003,15 +1007,17 @@ init_sigchld(int sig)
#if USE_TRAP_MASK
# ifdef HAVE_SIGPROCMASK
sigset_t mask;
+ sigset_t fullmask;
# else
int mask;
+ int fullmask;
# endif
#endif
#if USE_TRAP_MASK
/* disable interrupt */
- sigfillset(&mask);
- pthread_sigmask(SIG_BLOCK, &mask, &mask);
+ sigfillset(&fullmask);
+ pthread_sigmask(SIG_BLOCK, &fullmask, &mask);
#endif
oldfunc = ruby_signal(sig, SIG_DFL);