* 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
This commit is contained in:
kosaki 2011-07-12 04:55:50 +00:00
Родитель 888d8e93e1
Коммит 89e2951bde
3 изменённых файлов: 78 добавлений и 0 удалений

Просмотреть файл

@ -1,3 +1,13 @@
Tue Jul 12 13:49:32 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* 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.
Tue Jul 12 11:58:28 2011 NAKAMURA Usaku <usa@ruby-lang.org> Tue Jul 12 11:58:28 2011 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/setup.mak: support x86-amd64 cross compile environment. * win32/setup.mak: support x86-amd64 cross compile environment.

Просмотреть файл

@ -870,6 +870,45 @@ trap_ensure(struct trap_arg *arg)
} }
#endif #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: * call-seq:
* Signal.trap( signal, command ) -> obj * Signal.trap( signal, command ) -> obj
@ -912,6 +951,10 @@ sig_trap(int argc, VALUE *argv)
} }
arg.sig = trap_signm(argv[0]); arg.sig = trap_signm(argv[0]);
if (reserved_signal_p(arg.sig)) {
rb_raise(rb_eArgError, "can't trap reserved signal");
}
if (argc == 1) { if (argc == 1) {
arg.cmd = rb_block_proc(); arg.cmd = rb_block_proc();
arg.func = sighandler; arg.func = sighandler;

Просмотреть файл

@ -220,4 +220,29 @@ EOS
t.close! t.close!
assert_nil(error) assert_nil(error)
end end
def test_reserved_signal
assert_raise(ArgumentError) {
Signal.trap(:SEGV) {}
}
assert_raise(ArgumentError) {
Signal.trap(:BUS) {}
}
assert_raise(ArgumentError) {
Signal.trap(:ILL) {}
}
assert_raise(ArgumentError) {
Signal.trap(:FPE) {}
}
assert_raise(ArgumentError) {
Signal.trap(:VTALRM) {}
}
assert_raise(ArgumentError) {
Signal.trap(:CHLD) {}
}
assert_raise(ArgumentError) {
Signal.trap(:CLD) {}
}
end
end end