From 3955aef501ee1ca2c9a86ba4701966b9691e7127 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 6 Aug 2001 03:10:24 +0000 Subject: [PATCH] * struct.c (rb_struct_modify): should check frozen and taint status. * eval.c (rb_undefined): do not recurse if method_missing is undefined. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@1668 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ eval.c | 10 ++++++++-- gc.c | 2 +- struct.c | 15 +++++++++++++-- version.h | 4 ++-- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 43f4d7399a..26581ee12d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Mon Aug 6 00:35:03 2001 Guy Decoux + + * struct.c (rb_struct_modify): should check frozen and taint + status. + +Sun Aug 5 07:46:18 2001 Nobuyoshi Nakada + + * eval.c (rb_undefined): do not recurse if method_missing is + undefined. + Wed Aug 1 20:45:14 2001 Usaku Nakamura * win32/Makefile.sub: changed path separator of $LIB to '\'. diff --git a/eval.c b/eval.c index bf27483502..8ad1eab2fb 100644 --- a/eval.c +++ b/eval.c @@ -4135,12 +4135,18 @@ rb_undefined(obj, id, argc, argv, call_status) { VALUE *nargv; + last_call_status = call_status; + + if (id == missing) { + PUSH_FRAME(); + rb_f_missing(argc, argv, obj); + POP_FRAME(); + } + nargv = ALLOCA_N(VALUE, argc+1); nargv[0] = ID2SYM(id); MEMCPY(nargv+1, argv, VALUE, argc); - last_call_status = call_status; - return rb_funcall2(obj, missing, argc+1, nargv); } diff --git a/gc.c b/gc.c index 3ebdb2b8d9..ef85a1a2b3 100644 --- a/gc.c +++ b/gc.c @@ -963,7 +963,7 @@ rb_gc() alloca(0); # define STACK_END (&stack_end) #else -# if defined(__GNUC__) && (defined(__i386__) || defined(__m68k__)) +# if defined(__GNUC__) && (defined(__i386__) || defined(__mc68000__)) VALUE *stack_end = __builtin_frame_address(0); # else VALUE *stack_end = alloca(1); diff --git a/struct.c b/struct.c index 06db22d550..ecd9cf46dd 100644 --- a/struct.c +++ b/struct.c @@ -124,6 +124,15 @@ static VALUE (*ref_func[10])() = { rb_struct_ref9, }; +static void +rb_struct_modify(s) + VALUE s; +{ + if (OBJ_FROZEN(s)) rb_error_frozen("Struct"); + if (!OBJ_TAINTED(s) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify Struct"); +} + static VALUE rb_struct_set(obj, val) VALUE obj, val; @@ -135,6 +144,7 @@ rb_struct_set(obj, val) if (NIL_P(member)) { rb_bug("non-initialized struct"); } + rb_struct_modify(obj); for (i=0; ilen; i++) { slot = RARRAY(member)->ptr[i]; if (rb_id_attrset(SYM2ID(slot)) == rb_frame_last_func()) { @@ -253,6 +263,7 @@ rb_struct_initialize(self, values) VALUE size; long n; + rb_struct_modify(self); size = iv_get(klass, "__size__"); n = FIX2LONG(size); if (n < RARRAY(values)->len) { @@ -473,7 +484,7 @@ rb_struct_aset_id(s, id, val) rb_bug("non-initialized struct"); } - if (OBJ_FROZEN(s)) rb_error_frozen("Struct"); + rb_struct_modify(s); len = RARRAY(member)->len; for (i=0; iptr[i]) == id) { @@ -504,7 +515,7 @@ rb_struct_aset(s, idx, val) rb_raise(rb_eIndexError, "offset %d too large for struct(size:%d)", i, RSTRUCT(s)->len); } - if (OBJ_FROZEN(s)) rb_error_frozen("Struct"); + rb_struct_modify(s); return RSTRUCT(s)->ptr[i] = val; } diff --git a/version.h b/version.h index 4d72775714..0558b7437b 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,4 @@ #define RUBY_VERSION "1.6.4" -#define RUBY_RELEASE_DATE "2001-07-31" +#define RUBY_RELEASE_DATE "2001-08-06" #define RUBY_VERSION_CODE 164 -#define RUBY_RELEASE_CODE 20010731 +#define RUBY_RELEASE_CODE 20010806