diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-09-09 16:23:27 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-09-09 16:23:27 +0000 |
commit | c19fafb0a45cc30b04fdeb9eb5b5fb8a6d80be79 (patch) | |
tree | 0ac21acf6cbd7aee6de599b916649ce5c4ab6651 | |
parent | 3ee33a6dbc636a16ff1aa89f070e428842ed1f32 (diff) |
* marshal.c (r_object0): struct allocation first to check if a
class is a struct. compatibility check should come next.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13423 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | marshal.c | 10 |
2 files changed, 10 insertions, 5 deletions
@@ -1,3 +1,8 @@ +Mon Sep 10 01:21:23 2007 Yukihiro Matsumoto <matz@ruby-lang.org> + + * marshal.c (r_object0): struct allocation first to check if a + class is a struct. compatibility check should come next. + Mon Sep 10 01:05:25 2007 Yukihiro Matsumoto <matz@ruby-lang.org> * range.c (range_step): fixed integer overflow. [ruby-dev:31763] @@ -1254,18 +1254,18 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod) ID slot; klass = path2class(r_unique(arg)); - mem = rb_struct_s_members(klass); len = r_long(arg); + v = rb_obj_alloc(klass); + if (TYPE(v) != T_STRUCT) { + rb_raise(rb_eTypeError, "class %s not a struct", rb_class2name(klass)); + } + mem = rb_struct_s_members(klass); if (RARRAY_LEN(mem) != len) { rb_raise(rb_eTypeError, "struct %s not compatible (struct size differs)", rb_class2name(klass)); } - v = rb_obj_alloc(klass); - if (TYPE(v) != T_STRUCT) { - rb_raise(rb_eArgError, "dump format error"); - } v = r_entry(v, arg); values = rb_ary_new2(len); for (i=0; i<len; i++) { |