ruby-changes:19060
From: tadf <ko1@a...>
Date: Sat, 12 Mar 2011 02:28:51 +0900 (JST)
Subject: [ruby-changes:19060] Ruby:r31099 (trunk): * ext/date/date_core.c ({d,dt}_lite_marshal_load): checks the given argument.
tadf 2011-03-12 02:28:44 +0900 (Sat, 12 Mar 2011) New Revision: 31099 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31099 Log: * ext/date/date_core.c ({d,dt}_lite_marshal_load): checks the given argument. Modified files: trunk/ChangeLog trunk/ext/date/date_core.c Index: ChangeLog =================================================================== --- ChangeLog (revision 31098) +++ ChangeLog (revision 31099) @@ -1,3 +1,7 @@ +Sat Mar 12 02:27:07 2011 Tadayoshi Funaba <tadf@d...> + + * ext/date/date_core.c ({d,dt}_lite_marshal_load): checks the given argument. + Sat Mar 12 01:26:24 2011 Tadayoshi Funaba <tadf@d...> * ext/date/date_core.c: changed some directives. Index: ext/date/date_core.c =================================================================== --- ext/date/date_core.c (revision 31098) +++ ext/date/date_core.c (revision 31099) @@ -988,7 +988,7 @@ static VALUE d_lite_s_alloc(VALUE klass) { - return d_lite_s_new_internal_wo_civil(klass, 0, 0, 0); + return d_lite_s_new_internal_wo_civil(klass, 0, 0, LIGHT_MODE); } static VALUE @@ -2361,20 +2361,28 @@ { get_d1(self); - if (!FIXNUM_P(RARRAY_PTR(a)[0])) { + if (TYPE(a) != T_ARRAY) + rb_raise(rb_eTypeError, "expected an array"); + + switch (RARRAY_LEN(a)) { + case 3: dat->r.ajd = RARRAY_PTR(a)[0]; dat->r.of = RARRAY_PTR(a)[1]; dat->r.sg = RARRAY_PTR(a)[2]; dat->r.cache = rb_hash_new(); dat->r.flags = 0; - } - else { + break; + case 2: dat->l.jd = NUM2LONG(RARRAY_PTR(a)[0]); dat->l.sg = NUM2DBL(RARRAY_PTR(a)[1]); dat->l.year = 0; dat->l.mon = 0; dat->l.mday = 0; dat->l.flags = LIGHT_MODE | HAVE_JD; + break; + default: + rb_raise(rb_eTypeError, "invalid size"); + break; } if (FL_TEST(a, FL_EXIVAR)) { @@ -2436,7 +2444,7 @@ static VALUE dt_lite_s_alloc(VALUE klass) { - return dt_lite_s_new_internal_wo_civil(klass, 0, 0, 0, 0, 0, 0); + return dt_lite_s_new_internal_wo_civil(klass, 0, 0, 0, 0, 0, LIGHT_MODE); } static VALUE @@ -3841,14 +3849,18 @@ { get_dt1(self); - if (!FIXNUM_P(RARRAY_PTR(a)[0])) { + if (TYPE(a) != T_ARRAY) + rb_raise(rb_eTypeError, "expected an array"); + + switch (RARRAY_LEN(a)) { + case 3: dat->r.ajd = RARRAY_PTR(a)[0]; dat->r.of = RARRAY_PTR(a)[1]; dat->r.sg = RARRAY_PTR(a)[2]; dat->r.cache = rb_hash_new(); dat->r.flags = 0; - } - else { + break; + case 5: dat->l.jd = NUM2LONG(RARRAY_PTR(a)[0]); dat->l.df = FIX2INT(RARRAY_PTR(a)[1]); dat->l.sf = FIX2INT(RARRAY_PTR(a)[2]); @@ -3861,6 +3873,10 @@ dat->l.min = 0; dat->l.sec = 0; dat->l.flags = LIGHT_MODE | HAVE_JD | HAVE_DF; + break; + default: + rb_raise(rb_eTypeError, "invalid size"); + break; } if (FL_TEST(a, FL_EXIVAR)) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/