From f2820af9e0e228fe5182cccab704ce9d83c886c7 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Wed, 22 Aug 2007 00:56:18 +0000 Subject: * struct.c (rb_struct_init_copy): disallow changing the size. [ruby-dev:31168] git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_6@13164 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- struct.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'struct.c') diff --git a/struct.c b/struct.c index cdc6efa4b..88357dedc 100644 --- a/struct.c +++ b/struct.c @@ -252,7 +252,7 @@ rb_struct_define(name, va_alist) ary = rb_ary_new(); va_init_list(ar, name); - while (mem = va_arg(ar, char*)) { + while ((mem = va_arg(ar, char*)) != 0) { ID slot = rb_intern(mem); rb_ary_push(ary, ID2SYM(slot)); } @@ -557,8 +557,9 @@ rb_struct_init_copy(copy, s) if (!rb_obj_is_instance_of(s, rb_obj_class(copy))) { rb_raise(rb_eTypeError, "wrong argument class"); } - RSTRUCT(copy)->ptr = ALLOC_N(VALUE, RSTRUCT(s)->len); - RSTRUCT(copy)->len = RSTRUCT(s)->len; + if (RSTRUCT(copy)->len != RSTRUCT(s)->len) { + rb_raise(rb_eTypeError, "struct size mismatch"); + } MEMCPY(RSTRUCT(copy)->ptr, RSTRUCT(s)->ptr, VALUE, RSTRUCT(copy)->len); return copy; -- cgit