[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]