ruby-changes:20475
From: kosaki <ko1@a...>
Date: Tue, 12 Jul 2011 13:56:01 +0900 (JST)
Subject: [ruby-changes:20475] kosaki:r32523 (trunk): * signal.c (sig_trap): don't permit to change a signal handler which
kosaki 2011-07-12 13:55:50 +0900 (Tue, 12 Jul 2011) New Revision: 32523 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32523 Log: * 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. Modified files: trunk/ChangeLog trunk/signal.c trunk/test/ruby/test_signal.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 32522) +++ ChangeLog (revision 32523) @@ -1,3 +1,13 @@ +Tue Jul 12 13:49:32 2011 KOSAKI Motohiro <kosaki.motohiro@g...> + + * 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@r...> * win32/setup.mak: support x86-amd64 cross compile environment. Index: test/ruby/test_signal.rb =================================================================== --- test/ruby/test_signal.rb (revision 32522) +++ test/ruby/test_signal.rb (revision 32523) @@ -220,4 +220,29 @@ t.close! assert_nil(error) 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 Index: signal.c =================================================================== --- signal.c (revision 32522) +++ signal.c (revision 32523) @@ -870,6 +870,45 @@ } #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 @@ } 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; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/