diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-12 04:55:50 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-12 04:55:50 +0000 |
commit | 89e2951bde9b7f4e04a8f068bfde6756aebf74af (patch) | |
tree | 4139a5a7fe3f0973f2129507b37656b536d6bd6e /signal.c | |
parent | 888d8e93e1149991e2edaa5ddb78c11f803b4063 (diff) |
* signal.c (sig_trap): don't permit to change a signal handler which
the interpreter reserved.
* signal.c (reserved_signal_p): ditto.
[Bug #2616] [ruby-core:27625]
* test/ruby/test_signal.rb (TestSignal#test_reserved_signal):
added a test for reserved signal.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32523 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'signal.c')
-rw-r--r-- | signal.c | 43 |
1 files changed, 43 insertions, 0 deletions
@@ -870,6 +870,45 @@ trap_ensure(struct trap_arg *arg) } #endif +int reserved_signal_p(int signo) +{ +/* Synchronous signal can't deliver to main thread */ +#ifdef SIGSEGV + if (signo == SIGSEGV) + return 1; +#endif +#ifdef SIGBUS + if (signo == SIGBUS) + return 1; +#endif +#ifdef SIGILL + if (signo == SIGILL) + return 1; +#endif +#ifdef SIGFPE + if (signo == SIGFPE) + return 1; +#endif + +/* used ubf internal see thread_pthread.c. */ +#ifdef SIGVTALRM + if (signo == SIGVTALRM) + return 1; +#endif + +/* On some OSs, wait() never return if SIGCHLD handler is installed. */ +#ifdef SIGCHLD + if (signo == SIGCHLD) + return 1; +#endif +#ifdef SIGCLD + if (signo == SIGCLD) + return 1; +#endif + + return 0; +} + /* * call-seq: * Signal.trap( signal, command ) -> obj @@ -912,6 +951,10 @@ sig_trap(int argc, VALUE *argv) } arg.sig = trap_signm(argv[0]); + if (reserved_signal_p(arg.sig)) { + rb_raise(rb_eArgError, "can't trap reserved signal"); + } + if (argc == 1) { arg.cmd = rb_block_proc(); arg.func = sighandler; |