summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-15 13:37:47 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-15 13:37:47 +0000
commit29c2876d610275a42642ecb67ddc28906e484968 (patch)
tree8e23622a2735a6e446ea8c6b68847cb963b04896
parent980155686aa373e015f51e3e279403d2aa66d4b9 (diff)
* signal.c (rb_f_kill): accept '-SIGXXX' style signal with Symbol or
implicit convertion with #to_str. [ruby-dev:43169] fixes #4362 * test/ruby/test_signal.rb (test_signal_process_group): add a test for send signal to process group. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31579 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog7
-rw-r--r--signal.c19
-rw-r--r--test/ruby/test_signal.rb12
3 files changed, 27 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 543c13db83..1a8a923728 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sun May 15 22:26:39 2011 CHIKANAGA Tomoyuki <nagachika00@gmail.com>
+
+ * signal.c (rb_f_kill): accept '-SIGXXX' style signal with Symbol or
+ implicit convertion with #to_str. [ruby-dev:43169] fixes #4362
+ * test/ruby/test_signal.rb (test_signal_process_group): add a test
+ for send signal to process group.
+
Sun May 15 21:22:35 2011 CHIKANAGA Tomoyuki <nagachika00@gmail.com>
* cont.c (cont_init): clear macihne_stack_start/end of saved thread to
diff --git a/signal.c b/signal.c
index af129cad74..c7ad67fc81 100644
--- a/signal.c
+++ b/signal.c
@@ -359,6 +359,7 @@ rb_f_kill(int argc, VALUE *argv)
int negative = 0;
int sig;
int i;
+ volatile VALUE str;
const char *s;
rb_secure(2);
@@ -376,11 +377,11 @@ rb_f_kill(int argc, VALUE *argv)
case T_STRING:
s = RSTRING_PTR(argv[0]);
+ str_signal:
if (s[0] == '-') {
negative++;
s++;
}
- str_signal:
if (strncmp("SIG", s, 3) == 0)
s += 3;
if((sig = signm2signo(s)) == 0)
@@ -391,17 +392,13 @@ rb_f_kill(int argc, VALUE *argv)
break;
default:
- {
- VALUE str;
-
- str = rb_check_string_type(argv[0]);
- if (!NIL_P(str)) {
- s = RSTRING_PTR(str);
- goto str_signal;
- }
- rb_raise(rb_eArgError, "bad signal type %s",
- rb_obj_classname(argv[0]));
+ str = rb_check_string_type(argv[0]);
+ if (!NIL_P(str)) {
+ s = RSTRING_PTR(str);
+ goto str_signal;
}
+ rb_raise(rb_eArgError, "bad signal type %s",
+ rb_obj_classname(argv[0]));
break;
}
diff --git a/test/ruby/test_signal.rb b/test/ruby/test_signal.rb
index 0098ccc539..2b2d88b06f 100644
--- a/test/ruby/test_signal.rb
+++ b/test/ruby/test_signal.rb
@@ -36,6 +36,18 @@ class TestSignal < Test::Unit::TestCase
end
end
+ def test_signal_process_group
+ return unless Process.respond_to?(:kill)
+ bug4362 = '[ruby-dev:43169]'
+ assert_nothing_raised(bug4362) do
+ pid = Process.spawn(EnvUtil.rubybin, '-e', '"sleep 10"', :pgroup => true)
+ Process.kill(:"-TERM", pid)
+ Process.waitpid(pid)
+ assert_equal(true, $?.signaled?)
+ assert_equal(Signal.list["TERM"], $?.termsig)
+ end
+ end
+
def test_exit_action
return unless have_fork? # skip this test
begin