diff options
| -rw-r--r-- | include/mruby/error.h | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-time/src/time.c | 27 | ||||
| -rw-r--r-- | src/backtrace.c | 12 |
3 files changed, 27 insertions, 17 deletions
diff --git a/include/mruby/error.h b/include/mruby/error.h index 0d5b93c7c..a715eb0b6 100644 --- a/include/mruby/error.h +++ b/include/mruby/error.h @@ -26,8 +26,9 @@ MRB_API mrb_value mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value st #define mrb_exc_new_lit(mrb, c, lit) mrb_exc_new_str(mrb, c, mrb_str_new_lit(mrb, lit)) #define mrb_exc_new_str_lit(mrb, c, lit) mrb_exc_new_lit(mrb, c, lit) MRB_API mrb_value mrb_make_exception(mrb_state *mrb, mrb_int argc, const mrb_value *argv); -MRB_API mrb_value mrb_exc_backtrace(mrb_state *mrb, mrb_value exc); -MRB_API mrb_value mrb_get_backtrace(mrb_state *mrb); +mrb_value mrb_exc_backtrace(mrb_state *mrb, mrb_value exc); +mrb_value mrb_get_backtrace(mrb_state *mrb); + MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, const char *fmt, ...); /* declaration for `fail` method */ diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c index 907e3fcd2..22dec2e65 100644 --- a/mrbgems/mruby-time/src/time.c +++ b/mrbgems/mruby-time/src/time.c @@ -461,22 +461,29 @@ time_mktime(mrb_state *mrb, mrb_int ayear, mrb_int amonth, mrb_int aday, time_t nowsecs; struct tm nowtime = { 0 }; - nowtime.tm_year = (int)ayear - 1900; - nowtime.tm_mon = (int)amonth - 1; +#if MRB_INT_MAX > INT_MAX +#define OUTINT(x) (INT_MIN > (x) || (x) > INT_MAX) +#else +#define OUTINT(x) 0 +#endif + + if (OUTINT(ayear-1900) || + amonth < 1 || amonth > 12 || + aday < 1 || aday > 31 || + ahour < 0 || ahour > 24 || + (ahour == 24 && (amin > 0 || asec > 0)) || + amin < 0 || amin > 59 || + asec < 0 || asec > 60) + mrb_raise(mrb, E_ARGUMENT_ERROR, "argument out of range"); + + nowtime.tm_year = (int)(ayear - 1900); + nowtime.tm_mon = (int)(amonth - 1); nowtime.tm_mday = (int)aday; nowtime.tm_hour = (int)ahour; nowtime.tm_min = (int)amin; nowtime.tm_sec = (int)asec; nowtime.tm_isdst = -1; - if (nowtime.tm_mon < 0 || nowtime.tm_mon > 11 - || nowtime.tm_mday < 1 || nowtime.tm_mday > 31 - || nowtime.tm_hour < 0 || nowtime.tm_hour > 24 - || (nowtime.tm_hour == 24 && (nowtime.tm_min > 0 || nowtime.tm_sec > 0)) - || nowtime.tm_min < 0 || nowtime.tm_min > 59 - || nowtime.tm_sec < 0 || nowtime.tm_sec > 60) - mrb_raise(mrb, E_ARGUMENT_ERROR, "argument out of range"); - if (timezone == MRB_TIMEZONE_UTC) { nowsecs = timegm(&nowtime); } diff --git a/src/backtrace.c b/src/backtrace.c index 61d606869..0acc43a66 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -33,6 +33,7 @@ static void each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void *data) { ptrdiff_t i; + int n = 0; if (ciidx >= mrb->c->ciend - mrb->c->cibase) ciidx = 10; /* ciidx is broken... */ @@ -61,6 +62,7 @@ each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void * idx = (uint32_t)(pc - irep->iseq); loc.lineno = mrb_debug_get_line(mrb, irep, idx); + if (n++ == 0 && loc.lineno == -1) continue; loc.filename = mrb_debug_get_filename(mrb, irep, idx); if (!loc.filename) { @@ -195,6 +197,7 @@ mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace) bt = (struct backtrace_location*)mrb_data_check_get_ptr(mrb, backtrace, &bt_type); if (bt == NULL) goto empty_backtrace; n = (mrb_int)RDATA(backtrace)->flags; + if (n == 0) goto empty_backtrace; backtrace = mrb_ary_new_capa(mrb, n); ai = mrb_gc_arena_save(mrb); for (i = 0; i < n; i++) { @@ -218,19 +221,18 @@ mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace) return backtrace; } -MRB_API mrb_value +mrb_value mrb_exc_backtrace(mrb_state *mrb, mrb_value exc) { - mrb_sym attr_name; mrb_value backtrace; - attr_name = MRB_SYM(backtrace); - backtrace = mrb_iv_get(mrb, exc, attr_name); + backtrace = mrb_iv_get(mrb, exc, MRB_SYM(backtrace)); if (mrb_nil_p(backtrace) || mrb_array_p(backtrace)) { return backtrace; } + /* unpack packed-backtrace */ backtrace = mrb_unpack_backtrace(mrb, backtrace); - mrb_iv_set(mrb, exc, attr_name, backtrace); + mrb_iv_set(mrb, exc, MRB_SYM(backtrace), backtrace); return backtrace; } |
