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

ruby-changes:35575

From: nobu <ko1@a...>
Date: Sun, 21 Sep 2014 11:03:42 +0900 (JST)
Subject: [ruby-changes:35575] nobu:r47657 (trunk): signal.c: EINVAL is a failure

nobu	2014-09-21 11:03:34 +0900 (Sun, 21 Sep 2014)

  New Revision: 47657

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=47657

  Log:
    signal.c: EINVAL is a failure
    
    * signal.c (ruby_signal): although "EINVAL from sigaction(2) is
      not a bug", but even it is a failure.  pointed at toRuby/guRuby
      in RubyHiroba.

  Modified files:
    trunk/ChangeLog
    trunk/signal.c
    trunk/test/ruby/test_signal.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 47656)
+++ ChangeLog	(revision 47657)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sun Sep 21 11:03:32 2014  Nobuyoshi Nakada  <nobu@r...>
+
+	* signal.c (ruby_signal): although "EINVAL from sigaction(2) is
+	  not a bug", but even it is a failure.  pointed at toRuby/guRuby
+	  in RubyHiroba.
+
 Sat Sep 20 03:00:26 2014  Masaki Matsushita <glass.saga@g...>
 
 	* lib/tempfile.rb: define parameters appropriately and some
Index: test/ruby/test_signal.rb
===================================================================
--- test/ruby/test_signal.rb	(revision 47656)
+++ test/ruby/test_signal.rb	(revision 47657)
@@ -169,6 +169,14 @@ class TestSignal < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_signal.rb#L169
     end
   end if Process.respond_to?(:kill)
 
+  %w"KILL STOP".each do |sig|
+    if Signal.list.key?(sig)
+      define_method("test_trap_uncatchable_#{sig}") do
+        assert_raise(Errno::EINVAL, "SIG#{sig} is not allowed to be caught") { Signal.trap(sig) {} }
+      end
+    end
+  end
+
   def test_kill_immediately_before_termination
     Signal.list[sig = "USR1"] or sig = "INT"
     assert_in_out_err(["-e", <<-"end;"], "", %w"foo")
Index: signal.c
===================================================================
--- signal.c	(revision 47656)
+++ signal.c	(revision 47657)
@@ -258,6 +258,18 @@ ruby_signal_name(int no) https://github.com/ruby/ruby/blob/trunk/signal.c#L258
     return signo2signm(no);
 }
 
+static VALUE
+rb_signo2signm(int signo)
+{
+    const char *const signm = signo2signm(signo);
+    if (signm) {
+	return rb_sprintf("SIG%s", signm);
+    }
+    else {
+	return rb_sprintf("SIG%u", signo);
+    }
+}
+
 /*
  * call-seq:
  *    SignalException.new(sig_name)              ->  signal_exception
@@ -290,13 +302,7 @@ esignal_init(int argc, VALUE *argv, VALU https://github.com/ruby/ruby/blob/trunk/signal.c#L302
 	    sig = argv[1];
 	}
 	else {
-	    signm = signo2signm(signo);
-	    if (signm) {
-		sig = rb_sprintf("SIG%s", signm);
-	    }
-	    else {
-		sig = rb_sprintf("SIG%u", signo);
-	    }
+	    sig = rb_signo2signm(signo);
 	}
     }
     else {
@@ -600,8 +606,12 @@ ruby_signal(int signum, sighandler_t han https://github.com/ruby/ruby/blob/trunk/signal.c#L606
     }
     (void)VALGRIND_MAKE_MEM_DEFINED(&old, sizeof(old));
     if (sigaction(signum, &sigact, &old) < 0) {
-	if (errno != 0 && errno != EINVAL) {
-	    rb_bug_errno("sigaction", errno);
+	int e = errno;
+	if (e == EINVAL) {
+	    rb_syserr_fail_str(e, rb_signo2signm(signum));
+	}
+	else if (e != 0) {
+	    rb_bug_errno("sigaction", e);
 	}
     }
     if (old.sa_flags & SA_SIGINFO)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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