aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-08-16 10:15:28 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-08-16 10:15:28 +0000
commit9528358120511f0587be39c853f5916cf8d05a9d (patch)
tree3b626a2aab86b68d1af92ec27352b1068dcb4a7f
parenta39b94d3022e37f4a5c3ce7cd112ac01f6e2ceec (diff)
downloadruby-9528358120511f0587be39c853f5916cf8d05a9d.tar.gz
object.c: forbid uninitialized class
* object.c (rb_class_initialize): forbid inheriting uninitialized class. another class tree not based on BasicObject cannot exist. [ruby-core:47148][Bug #6863] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36714 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--object.c3
-rw-r--r--test/ruby/test_class.rb2
3 files changed, 11 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 986c5e2151..87be08978d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Aug 16 19:15:23 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (rb_class_initialize): forbid inheriting uninitialized
+ class. another class tree not based on BasicObject cannot exist.
+ [ruby-core:47148][Bug #6863]
+
Thu Aug 16 11:52:06 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* test/-ext-/test_printf.rb (Test_SPrintf#test_{taint,untrust}): use
diff --git a/object.c b/object.c
index b7e1b58c81..73f76fa753 100644
--- a/object.c
+++ b/object.c
@@ -1616,6 +1616,9 @@ rb_class_initialize(int argc, VALUE *argv, VALUE klass)
else {
rb_scan_args(argc, argv, "01", &super);
rb_check_inheritable(super);
+ if (super != rb_cBasicObject && !RCLASS_SUPER(super)) {
+ rb_raise(rb_eTypeError, "can't inherit uninitialized class");
+ }
}
RCLASS_SUPER(klass) = super;
rb_make_metaclass(klass, RBASIC(super)->klass);
diff --git a/test/ruby/test_class.rb b/test/ruby/test_class.rb
index 12f78ddabc..88fe79bb11 100644
--- a/test/ruby/test_class.rb
+++ b/test/ruby/test_class.rb
@@ -203,6 +203,8 @@ class TestClass < Test::Unit::TestCase
def test_uninitialized
assert_raise(TypeError) { Class.allocate.new }
assert_raise(TypeError) { Class.allocate.superclass }
+ bug6863 = '[ruby-core:47148]'
+ assert_raise(TypeError, bug6863) { Class.new(Class.allocate) }
end
def test_nonascii_name