summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-11-24 03:44:45 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-11-24 03:44:45 +0000
commit09fbd56e6f1774254a2f1999897231d0ff5ae84b (patch)
treee68e110133db6dd032bbbeb6e6a4c363d991b571
parenta6755b6e5feb09bdcd50409b0af377779ec02b91 (diff)
process.c: get rid of inadvertent ID pindown
* process.c (check_exec_redirect_fd, check_exec_redirect), (rb_execarg_addopt): get rid of inadvertent ID pindown. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48552 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--process.c13
-rw-r--r--test/-ext-/symbol/test_inadvertent_creation.rb32
3 files changed, 44 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 46bb1ad..f899bba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Nov 24 12:44:35 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (check_exec_redirect_fd, check_exec_redirect),
+ (rb_execarg_addopt): get rid of inadvertent ID pindown.
+
Mon Nov 24 02:03:40 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* string.c (rb_str_setter): preserve encoding of global variable
diff --git a/process.c b/process.c
index 6516106..a4de704 100644
--- a/process.c
+++ b/process.c
@@ -1489,7 +1489,7 @@ check_exec_redirect_fd(VALUE v, int iskey)
fd = FIX2INT(v);
}
else if (SYMBOL_P(v)) {
- ID id = SYM2ID(v);
+ ID id = rb_check_id(&v);
if (id == id_in)
fd = 0;
else if (id == id_out)
@@ -1553,7 +1553,7 @@ check_exec_redirect(VALUE key, VALUE val, struct rb_execarg *eargp)
switch (TYPE(val)) {
case T_SYMBOL:
- id = SYM2ID(val);
+ if (!(id = rb_check_id(&val))) goto wrong_symbol;
if (id == id_close) {
param = Qnil;
eargp->fd_close = check_exec_redirect1(eargp->fd_close, key, param);
@@ -1571,8 +1571,9 @@ check_exec_redirect(VALUE key, VALUE val, struct rb_execarg *eargp)
eargp->fd_dup2 = check_exec_redirect1(eargp->fd_dup2, key, param);
}
else {
- rb_raise(rb_eArgError, "wrong exec redirect symbol: %s",
- rb_id2name(id));
+ wrong_symbol:
+ rb_raise(rb_eArgError, "wrong exec redirect symbol: %"PRIsVALUE,
+ val);
}
break;
@@ -1588,7 +1589,7 @@ check_exec_redirect(VALUE key, VALUE val, struct rb_execarg *eargp)
case T_ARRAY:
path = rb_ary_entry(val, 0);
if (RARRAY_LEN(val) == 2 && SYMBOL_P(path) &&
- SYM2ID(path) == id_child) {
+ path == ID2SYM(id_child)) {
param = check_exec_redirect_fd(rb_ary_entry(val, 1), 0);
eargp->fd_dup2_child = check_exec_redirect1(eargp->fd_dup2_child, key, param);
}
@@ -1663,7 +1664,7 @@ rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val)
switch (TYPE(key)) {
case T_SYMBOL:
- id = SYM2ID(key);
+ if (!(id = rb_check_id(&key))) return ST_STOP;
#ifdef HAVE_SETPGID
if (id == id_pgroup) {
rb_pid_t pgroup;
diff --git a/test/-ext-/symbol/test_inadvertent_creation.rb b/test/-ext-/symbol/test_inadvertent_creation.rb
index 14e6abd..abcb5d9 100644
--- a/test/-ext-/symbol/test_inadvertent_creation.rb
+++ b/test/-ext-/symbol/test_inadvertent_creation.rb
@@ -320,5 +320,37 @@ module Test_Symbol
end
end;
end
+
+ def test_execopt_key
+ name = noninterned_name.intern
+ assert_raise(ArgumentError) {
+ system(".", name => nil)
+ }
+ assert_not_pinneddown(name)
+ end
+
+ def test_execopt_redirect_value
+ name = noninterned_name.intern
+ assert_raise(ArgumentError) {
+ system(".", [] => name)
+ }
+ assert_not_pinneddown(name)
+ end
+
+ def test_execopt_redirect_path
+ name = noninterned_name.intern
+ assert_raise(TypeError) {
+ system(".", [] => [name, 0])
+ }
+ assert_not_pinneddown(name)
+ end
+
+ def test_execopt_redirect_symbol
+ name = noninterned_name.intern
+ assert_raise(ArgumentError) {
+ system(".", in: name)
+ }
+ assert_not_pinneddown(name)
+ end
end
end