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

ruby-changes:45084

From: nobu <ko1@a...>
Date: Fri, 23 Dec 2016 09:05:46 +0900 (JST)
Subject: [ruby-changes:45084] nobu:r57157 (trunk): time.c: inquire suspicious values

nobu	2016-12-23 09:05:40 +0900 (Fri, 23 Dec 2016)

  New Revision: 57157

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=57157

  Log:
    time.c: inquire suspicious values
    
    * time.c (time_arg): dump sec and subsec arguments if subsecx is
      insane.

  Modified files:
    trunk/time.c
Index: time.c
===================================================================
--- time.c	(revision 57156)
+++ time.c	(revision 57157)
@@ -54,27 +54,38 @@ eq(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/time.c#L54
 }
 
 #ifdef _MSC_VER
-static VALUE
-inquire_value(VALUE x, const char *mesg)
+static void *
+value_insane_p(VALUE x)
 {
     VALUE klass;
     LPEXCEPTION_POINTERS info;
-    if (SPECIAL_CONST_P(x)) return Qnil;
+    void *failed_address = 0;
+    if (SPECIAL_CONST_P(x)) return 0;
+    if (!RBASIC_CLASS(x)) return (void *)x;
     __try {
-	klass = CLASS_OF(x);
+	RB_GC_GUARD(klass) = RBASIC_CLASS(x);
     }
     __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
 	      (info = GetExceptionInformation(), EXCEPTION_EXECUTE_HANDLER) :
 	      EXCEPTION_CONTINUE_SEARCH) {
 	PEXCEPTION_RECORD rec = info->ExceptionRecord;
+	failed_address = (void *)rec->ExceptionInformation[1];
+    }
+    return failed_address;
+}
+
+static void
+inquire_value(VALUE x, const char *mesg)
+{
+    void *failed_address = value_insane_p(x);
+    if (failed_address) {
 	rb_fatal("Access violation at %p: class of %p: %s",
-		 (void *)rec->ExceptionInformation[1],
-		 (void *)x, mesg);
+		 failed_address, (void *)x, mesg);
     }
-    return klass;
 }
 #else
-# define inquire_value(x, mesg) (void)(x)
+# define value_insane_p(x) ((void)(x), 0)
+# define inquire_value(x, mesg) (void)value_insane_p(x)
 #endif
 
 static int
@@ -2607,6 +2618,12 @@ time_arg(int argc, VALUE *argv, struct v https://github.com/ruby/ruby/blob/trunk/time.c#L2618
         vtm->sec  = NIL_P(v[5])?0:obj2subsecx(v[5], &vtm->subsecx);
     }
 
+    if (value_insane_p(vtm->subsecx)) {
+	rb_fatal("argc=%d, sec=%"PRIsVALUE", subsec=%"PRIsVALUE", subsecx=%p",
+		 argc, v[5], argc == 7 ? v[6] : Qnil,
+		 &RBASIC_CLASS(vtm->subsecx));
+    }
+
     validate_vtm(vtm);
     RB_GC_GUARD(vtm->subsecx);
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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