623
623
value . map ( &:encoding ) . should == [ Encoding ::UTF_8 , Encoding ::UTF_8 , Encoding ::UTF_8 ]
624
624
value . should == [ *expected , expected [ 0 ] ]
625
625
end
626
+
627
+ it "raises ArgumentError when end of byte sequence reached before symbol characters end" do
628
+ Marshal . dump ( :hello ) . should == "\x04 \b :\n hello"
629
+
630
+ -> {
631
+ Marshal . send ( @method , "\x04 \b :\n hel" )
632
+ } . should raise_error ( ArgumentError , "marshal data too short" )
633
+ end
626
634
end
627
635
628
636
describe "for a String" do
@@ -685,6 +693,14 @@ def io.binmode; raise "binmode"; end
685
693
result . encoding . should == Encoding ::BINARY
686
694
result . should == str
687
695
end
696
+
697
+ it "raises ArgumentError when end of byte sequence reached before string characters end" do
698
+ Marshal . dump ( "hello" ) . should == "\x04 \b \" \n hello"
699
+
700
+ -> {
701
+ Marshal . send ( @method , "\x04 \b \" \n hel" )
702
+ } . should raise_error ( ArgumentError , "marshal data too short" )
703
+ end
688
704
end
689
705
690
706
describe "for a Struct" do
@@ -819,6 +835,14 @@ def io.binmode; raise "binmode"; end
819
835
Marshal . send ( @method , "\x04 \b o:\t File\001 \001 :\001 \005 @path\" \x10 /etc/passwd" )
820
836
end . should raise_error ( ArgumentError )
821
837
end
838
+
839
+ it "raises ArgumentError when end of byte sequence reached before class name end" do
840
+ Marshal . dump ( Object . new ) . should == "\x04 \b o:\v Object\x00 "
841
+
842
+ -> {
843
+ Marshal . send ( @method , "\x04 \b o:\v Obj" )
844
+ } . should raise_error ( ArgumentError , "marshal data too short" )
845
+ end
822
846
end
823
847
824
848
describe "for an object responding to #marshal_dump and #marshal_load" do
@@ -908,6 +932,14 @@ def io.binmode; raise "binmode"; end
908
932
regexp . encoding . should == Encoding ::UTF_32LE
909
933
regexp . source . should == "a" . encode ( "utf-32le" )
910
934
end
935
+
936
+ it "raises ArgumentError when end of byte sequence reached before source string end" do
937
+ Marshal . dump ( /hello world/ ) . should == "\x04 \b I/\x10 hello world\x00 \x06 :\x06 EF"
938
+
939
+ -> {
940
+ Marshal . send ( @method , "\x04 \b I/\x10 hel" )
941
+ } . should raise_error ( ArgumentError , "marshal data too short" )
942
+ end
911
943
end
912
944
913
945
describe "for a Float" do
@@ -929,6 +961,14 @@ def io.binmode; raise "binmode"; end
929
961
obj = 1.1867345e+22
930
962
Marshal . send ( @method , "\004 \b f\036 1.1867344999999999e+22\000 \344 @" ) . should == obj
931
963
end
964
+
965
+ it "raises ArgumentError when end of byte sequence reached before float string representation end" do
966
+ Marshal . dump ( 1.3 ) . should == "\x04 \b f\b 1.3"
967
+
968
+ -> {
969
+ Marshal . send ( @method , "\004 \b f\v 1" )
970
+ } . should raise_error ( ArgumentError , "marshal data too short" )
971
+ end
932
972
end
933
973
934
974
describe "for an Integer" do
@@ -1114,6 +1154,14 @@ def io.binmode; raise "binmode"; end
1114
1154
it "raises ArgumentError if given a nonexistent class" do
1115
1155
-> { Marshal . send ( @method , "\x04 \b c\v Strung" ) } . should raise_error ( ArgumentError )
1116
1156
end
1157
+
1158
+ it "raises ArgumentError when end of byte sequence reached before class name end" do
1159
+ Marshal . dump ( String ) . should == "\x04 \b c\v String"
1160
+
1161
+ -> {
1162
+ Marshal . send ( @method , "\x04 \b c\v Str" )
1163
+ } . should raise_error ( ArgumentError , "marshal data too short" )
1164
+ end
1117
1165
end
1118
1166
1119
1167
describe "for a Module" do
@@ -1128,6 +1176,14 @@ def io.binmode; raise "binmode"; end
1128
1176
it "loads an old module" do
1129
1177
Marshal . send ( @method , "\x04 \b M\v Kernel" ) . should == Kernel
1130
1178
end
1179
+
1180
+ it "raises ArgumentError when end of byte sequence reached before module name end" do
1181
+ Marshal . dump ( Kernel ) . should == "\x04 \b m\v Kernel"
1182
+
1183
+ -> {
1184
+ Marshal . send ( @method , "\x04 \b m\v Ker" )
1185
+ } . should raise_error ( ArgumentError , "marshal data too short" )
1186
+ end
1131
1187
end
1132
1188
1133
1189
describe "for a wrapped C pointer" do
0 commit comments