Skip to content
This repository has been archived by the owner on Jul 25, 2022. It is now read-only.

Commit

Permalink
range.c: check loading
Browse files Browse the repository at this point in the history
* range.c (range_loader): check loading values if the data came
  from an initialized range object. [ruby-core:78067] [Bug #12915]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56703 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
nobu committed Nov 11, 2016
1 parent e41ebc5 commit 54bc0a4
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
11 changes: 8 additions & 3 deletions range.c
Expand Up @@ -1231,14 +1231,19 @@ range_dumper(VALUE range)
static VALUE
range_loader(VALUE range, VALUE obj)
{
VALUE beg, end, excl;

if (!RB_TYPE_P(obj, T_OBJECT) || RBASIC(obj)->klass != rb_cObject) {
rb_raise(rb_eTypeError, "not a dumped range object");
}

range_modify(range);
RANGE_SET_BEG(range, rb_ivar_get(obj, id_beg));
RANGE_SET_END(range, rb_ivar_get(obj, id_end));
RANGE_SET_EXCL(range, rb_ivar_get(obj, id_excl));
beg = rb_ivar_get(obj, id_beg);
end = rb_ivar_get(obj, id_end);
excl = rb_ivar_get(obj, id_excl);
if (!NIL_P(excl)) {
range_init(range, beg, end, RBOOL(RTEST(excl)));
}
return range;
}

Expand Down
10 changes: 10 additions & 0 deletions test/ruby/test_range.rb
Expand Up @@ -110,6 +110,16 @@ def test_uninitialized_range
assert_nothing_raised { r.instance_eval { initialize 5, 6} }
end

def test_marshal
r = 1..2
assert_equal(r, Marshal.load(Marshal.dump(r)))
r = 1...2
assert_equal(r, Marshal.load(Marshal.dump(r)))
s = Marshal.dump(r)
s.sub!(/endi./n, 'end0')
assert_raise(ArgumentError) {Marshal.load(s)}
end

def test_bad_value
assert_raise(ArgumentError) { (1 .. :a) }
end
Expand Down

0 comments on commit 54bc0a4

Please sign in to comment.