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/