[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]