summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-10 10:36:35 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-10 10:36:35 +0000
commitdcb28f0da50a3e75e2b1e5f3053b44e361d87c62 (patch)
tree15fbe5df72b7e5e9bfd922fdfed69557292954be
parente28760adfff7b516c7fd107feb4845e5cd6afece (diff)
signal.c: check NUL bytes
* signal.c (trap_signm): check NUL bytes explicitly before raising "unsupported signal" ArgumentError. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62715 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--signal.c20
-rw-r--r--test/ruby/test_signal.rb2
2 files changed, 9 insertions, 13 deletions
diff --git a/signal.c b/signal.c
index d71f757ca5..b688532dfb 100644
--- a/signal.c
+++ b/signal.c
@@ -1206,23 +1206,17 @@ trap_signm(VALUE vsig)
int sig = -1;
const char *s;
- switch (TYPE(vsig)) {
- case T_FIXNUM:
+ if (FIXNUM_P(vsig)) {
sig = FIX2INT(vsig);
if (sig < 0 || sig >= NSIG) {
rb_raise(rb_eArgError, "invalid signal number (%d)", sig);
}
- break;
-
- case T_SYMBOL:
- vsig = rb_sym2str(vsig);
- s = RSTRING_PTR(vsig);
- goto str_signal;
-
- default:
- s = StringValuePtr(vsig);
-
- str_signal:
+ }
+ else {
+ if (RB_SYMBOL_P(vsig)) {
+ vsig = rb_sym2str(vsig);
+ }
+ s = StringValueCStr(vsig);
if (strncmp(signame_prefix, s, sizeof(signame_prefix)) == 0)
s += 3;
sig = signm2signo(s);
diff --git a/test/ruby/test_signal.rb b/test/ruby/test_signal.rb
index 3357b871e9..931e104d83 100644
--- a/test/ruby/test_signal.rb
+++ b/test/ruby/test_signal.rb
@@ -164,6 +164,8 @@ class TestSignal < Test::Unit::TestCase
assert_raise(ArgumentError) { Signal.trap("XXXXXXXXXX", "SIG_DFL") }
assert_raise_with_message(ArgumentError, /\u{30eb 30d3 30fc}/) { Signal.trap("\u{30eb 30d3 30fc}", "SIG_DFL") }
+
+ assert_raise(ArgumentError) { Signal.trap("EXIT\0") {} }
ensure
Signal.trap(:INT, oldtrap) if oldtrap
end