Skip to content

Commit 477c282

Browse files
committed
merge revision(s) 54105,54108,54136,54138: [Backport ruby#12188]
* marshal.c (r_object0): Fix Marshal crash for corrupt extended object. * marshal.c (r_object0): raise ArgumentError when linking to undefined object. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@54274 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent d86cba8 commit 477c282

File tree

4 files changed

+35
-2
lines changed

4 files changed

+35
-2
lines changed

ChangeLog

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
Fri Mar 25 18:18:29 2016 Eric Hodel <drbrain@segment7.net>
2+
3+
* marshal.c (r_object0): raise ArgumentError when linking to undefined
4+
object.
5+
6+
Fri Mar 25 18:18:29 2016 Eric Hodel <drbrain@segment7.net>
7+
8+
* marshal.c (r_object0): Fix Marshal crash for corrupt extended object.
9+
110
Fri Mar 25 18:07:48 2016 Yutaka Kanemoto <kanemoto@ruby-lang.org>
211

312
* cont.c (rb_fiber_struct): keep context.uc_stack.ss_sp and context.uc_stack.ss_size

marshal.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1515,6 +1515,7 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
15151515
{
15161516
VALUE path = r_unique(arg);
15171517
VALUE m = rb_path_to_class(path);
1518+
if (NIL_P(extmod)) extmod = rb_ary_tmp_new(0);
15181519

15191520
if (RB_TYPE_P(m, T_CLASS)) { /* prepended */
15201521
VALUE c;
@@ -1534,7 +1535,6 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
15341535
}
15351536
else {
15361537
must_be_module(m, path);
1537-
if (NIL_P(extmod)) extmod = rb_ary_tmp_new(0);
15381538
rb_ary_push(extmod, m);
15391539

15401540
v = r_object0(arg, 0, extmod);
@@ -1894,6 +1894,11 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
18941894
rb_raise(rb_eArgError, "dump format error(0x%x)", type);
18951895
break;
18961896
}
1897+
1898+
if (v == Qundef) {
1899+
rb_raise(rb_eArgError, "dump format error (bad link)");
1900+
}
1901+
18971902
return v;
18981903
}
18991904

test/ruby/test_marshal.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require 'test/unit'
22
require 'tempfile'
3+
require_relative 'envutil'
34
require_relative 'marshaltestlib'
45

56
class TestMarshal < Test::Unit::TestCase
@@ -612,4 +613,22 @@ def test_marshal_honor_post_proc_value_for_link
612613
obj = [str, str]
613614
assert_equal(['X', 'X'], Marshal.load(Marshal.dump(obj), ->(v) { v == str ? v.upcase : v }))
614615
end
616+
617+
def test_marshal_load_extended_class_crash
618+
crash = "\x04\be:\x0F\x00omparableo:\vObject\x00"
619+
620+
opt = %w[--disable=gems]
621+
assert_ruby_status(opt, "Marshal.load(#{crash.dump})")
622+
end
623+
624+
def test_marshal_load_r_prepare_reference_crash
625+
crash = "\x04\bI/\x05\x00\x06:\x06E{\x06@\x05T"
626+
627+
opt = %w[--disable=gems]
628+
assert_separately(opt, <<-RUBY)
629+
assert_raise_with_message(ArgumentError, /bad link/) do
630+
Marshal.load(#{crash.dump})
631+
end
632+
RUBY
633+
end
615634
end

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#define RUBY_VERSION "2.1.9"
22
#define RUBY_RELEASE_DATE "2016-03-25"
3-
#define RUBY_PATCHLEVEL 471
3+
#define RUBY_PATCHLEVEL 472
44

55
#define RUBY_RELEASE_YEAR 2016
66
#define RUBY_RELEASE_MONTH 3

0 commit comments

Comments
 (0)