diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | object.c | 3 | ||||
-rw-r--r-- | test/ruby/test_class.rb | 2 |
3 files changed, 11 insertions, 0 deletions
@@ -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 @@ -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 |