diff options
Diffstat (limited to 'test/ruby/test_marshal.rb')
| -rw-r--r-- | test/ruby/test_marshal.rb | 69 |
1 files changed, 58 insertions, 11 deletions
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb index eb66994801..48a67e1dc5 100644 --- a/test/ruby/test_marshal.rb +++ b/test/ruby/test_marshal.rb @@ -314,7 +314,7 @@ class TestMarshal < Test::Unit::TestCase def test_regexp2 assert_equal(/\\u/, Marshal.load("\004\b/\b\\\\u\000")) assert_equal(/u/, Marshal.load("\004\b/\a\\u\000")) - assert_equal(/u/, Marshal.load("\004\bI/\a\\u\000\006:\016@encoding\"\vEUC-JP")) + assert_raise(FrozenError) { Marshal.load("\x04\bI/\x06u\x00\a:\x06EF:\t@fooi/") } bug2109 = '[ruby-core:25625]' a = "\x82\xa0".force_encoding(Encoding::Windows_31J) @@ -471,7 +471,7 @@ class TestMarshal < Test::Unit::TestCase class TooComplex def initialize - @marshal_too_complex = 1 + @marshal_complex = 1 end end @@ -487,10 +487,10 @@ class TestMarshal < Test::Unit::TestCase obj.instance_variable_set(ivar, 1) if defined?(RubyVM::Shape) - assert_predicate(RubyVM::Shape.of(obj), :too_complex?) + assert_predicate(RubyVM::Shape.of(obj), :complex?) end obj.object_id - assert_equal "\x04\bo:\x1CTestMarshal::TooComplex\a:\x19@marshal_too_complexi\x06:\f#{ivar}i\x06".b, Marshal.dump(obj) + assert_equal "\x04\bo:\x1CTestMarshal::TooComplex\a:\x15@marshal_complexi\x06:\f#{ivar}i\x06".b, Marshal.dump(obj) end def test_marshal_complex @@ -859,17 +859,15 @@ class TestMarshal < Test::Unit::TestCase def test_marshal_dump_adding_instance_variable obj = Bug15968.new - assert_raise_with_message(RuntimeError, /instance variable added/) do - Marshal.dump(obj) - end + loaded = Marshal.load(Marshal.dump(obj)) + assert_nil loaded.baz end def test_marshal_dump_removing_instance_variable obj = Bug15968.new obj.baz = :Bug15968 - assert_raise_with_message(RuntimeError, /instance variable removed/) do - Marshal.dump(obj) - end + loaded = Marshal.load(Marshal.dump(obj)) + assert_equal :Bug15968, loaded.baz end ruby2_keywords def ruby2_keywords_hash(*a) @@ -935,6 +933,41 @@ class TestMarshal < Test::Unit::TestCase end end + def test_load_overread + input = Struct.new(:bytes, :used) do + def initialize + super("\x04\x08[\x07".bytes, false) + end + + def getbyte + bytes.shift + end + + def read(_len, _outbuf = nil) + return nil if used + self.used = true + "0" * (1024 * 128) + end + end.new + + assert_equal([nil, nil], Marshal.load(input)) + end + + def test_bignum_len_overflow + assert_raise(ArgumentError) do + Marshal.load("\x04\x08l+\x04\x00\x00\x00\x40") + end + assert_raise(ArgumentError) do + Marshal.load("\x04\x08l+\xfc\x00\x00\x00\x80") + end + end + + def test_bignum_invalid_sign + assert_raise(ArgumentError) do + Marshal.load("\x04\bl?") + end + end + class TestMarshalFreezeProc < Test::Unit::TestCase include MarshalTestLib @@ -988,7 +1021,7 @@ class TestMarshal < Test::Unit::TestCase end def test_proc_returned_object_are_not_frozen - source = ["foo", {}, /foo/, 1..2] + source = ["foo", {}, 1..2] objects = Marshal.load(encode(source), ->(o) { o.dup }, freeze: true) assert_equal source, objects refute_predicate objects, :frozen? @@ -1002,5 +1035,19 @@ class TestMarshal < Test::Unit::TestCase refute_predicate Object, :frozen? refute_predicate Kernel, :frozen? end + + def test_linked_strings_are_frozen + str = "test" + str.instance_variable_set(:@self, str) + source = [str, str] + + objects = Marshal.load(encode(source), freeze: true) + assert_predicate objects[0], :frozen? + assert_predicate objects[1], :frozen? + assert_same objects[0], objects[1] + assert_same objects[0], objects[0].instance_variable_get(:@self) + assert_same objects[1], objects[1].instance_variable_get(:@self) + assert_same objects[0].instance_variable_get(:@self), objects[1].instance_variable_get(:@self) + end end end |
