aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-19 10:34:13 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-19 10:34:13 +0000
commitc3026b723c4af4be56e3297a29d5a21b5d64eecc (patch)
tree500872e0d05c193ba3c921ff44ba91a5f1869d9a
parent542a12d673ee5da8a7b8d40d66415f3e72bb0077 (diff)
downloadruby-c3026b723c4af4be56e3297a29d5a21b5d64eecc.tar.gz
object.c: nul in const name
* object.c (rb_mod_const_get): nul byte is invalid as constant name. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--object.c7
-rw-r--r--test/ruby/test_module.rb9
3 files changed, 17 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 4ed25a3091..680489b568 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Wed Dec 19 19:34:03 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (rb_mod_const_get): nul byte is invalid as constant name.
+
Wed Dec 19 17:54:18 2012 Masaya Tarui <tarui@ruby-lang.org>
* vm_trace.c (rb_threadptr_exec_event_hooks): get rid of race
diff --git a/object.c b/object.c
index b4e67bab5b..b05b41be25 100644
--- a/object.c
+++ b/object.c
@@ -1920,7 +1920,7 @@ rb_mod_const_get(int argc, VALUE *argv, VALUE mod)
{
VALUE name, recur;
rb_encoding *enc;
- const char *pbeg, *p, *path;
+ const char *pbeg, *p, *path, *pend;
ID id;
if (argc == 1) {
@@ -1946,6 +1946,7 @@ rb_mod_const_get(int argc, VALUE *argv, VALUE mod)
}
pbeg = p = path;
+ pend = path + RSTRING_LEN(name);
if (!*p) {
rb_raise(rb_eNameError, "wrong constant name %s", path);
@@ -1957,10 +1958,10 @@ rb_mod_const_get(int argc, VALUE *argv, VALUE mod)
pbeg = p;
}
- while (*p) {
+ while (p < pend) {
VALUE part;
- while (*p && *p != ':') p++;
+ while (p < pend && *p != ':') p++;
if (pbeg == p) {
rb_raise(rb_eNameError, "wrong constant name %s", path);
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index b2e2e8049d..eb1477893b 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -583,9 +583,18 @@ class TestModule < Test::Unit::TestCase
def test_const_get_invalid_name
c1 = Class.new
+ assert_raise(NameError) { c1.const_get(:foo) }
+ bug5084 = '[ruby-dev:44200]'
+ assert_raise(TypeError, bug5084) { c1.const_get(1) }
+ assert_raise(NameError) { Object.const_get("String\0") }
+ end
+
+ def test_const_defined_invalid_name
+ c1 = Class.new
assert_raise(NameError) { c1.const_defined?(:foo) }
bug5084 = '[ruby-dev:44200]'
assert_raise(TypeError, bug5084) { c1.const_defined?(1) }
+ assert_raise(NameError) { Object.const_defined?("String\0") }
end
def test_const_get_no_inherited