Skip to content

Commit 3d9aa46

Browse files
committed
Add NULL checks for Time data retrieval
1 parent c70e206 commit 3d9aa46

File tree

1 file changed

+35
-26
lines changed

1 file changed

+35
-26
lines changed

mrbgems/mruby-time/src/time.c

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,17 @@ mrb_time_local(mrb_state *mrb, mrb_value self)
368368
time_mktime(mrb, ayear, amonth, aday, ahour, amin, asec, ausec, MRB_TIMEZONE_LOCAL));
369369
}
370370

371+
static struct mrb_time*
372+
time_get_ptr(mrb_state *mrb, mrb_value time)
373+
{
374+
struct mrb_time *tm;
375+
376+
tm = DATA_GET_PTR(mrb, time, &mrb_time_type, struct mrb_time);
377+
if (!tm) {
378+
mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized time");
379+
}
380+
return tm;
381+
}
371382

372383
static mrb_value
373384
mrb_time_eq(mrb_state *mrb, mrb_value self)
@@ -377,7 +388,7 @@ mrb_time_eq(mrb_state *mrb, mrb_value self)
377388
mrb_bool eq_p;
378389

379390
mrb_get_args(mrb, "o", &other);
380-
tm1 = DATA_CHECK_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
391+
tm1 = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
381392
tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
382393
eq_p = tm1 && tm2 && tm1->sec == tm2->sec && tm1->usec == tm2->usec;
383394

@@ -391,7 +402,7 @@ mrb_time_cmp(mrb_state *mrb, mrb_value self)
391402
struct mrb_time *tm1, *tm2;
392403

393404
mrb_get_args(mrb, "o", &other);
394-
tm1 = DATA_CHECK_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
405+
tm1 = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
395406
tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
396407
if (!tm1 || !tm2) return mrb_nil_value();
397408
if (tm1->sec > tm2->sec) {
@@ -417,7 +428,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self)
417428
struct mrb_time *tm;
418429

419430
mrb_get_args(mrb, "f", &f);
420-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
431+
tm = time_get_ptr(mrb, self);
421432
return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec+f, (double)tm->usec, tm->timezone);
422433
}
423434

@@ -429,8 +440,7 @@ mrb_time_minus(mrb_state *mrb, mrb_value self)
429440
struct mrb_time *tm, *tm2;
430441

431442
mrb_get_args(mrb, "o", &other);
432-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
433-
443+
tm = time_get_ptr(mrb, self);
434444
tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
435445
if (tm2) {
436446
f = (mrb_float)(tm->sec - tm2->sec)
@@ -450,7 +460,7 @@ mrb_time_wday(mrb_state *mrb, mrb_value self)
450460
{
451461
struct mrb_time *tm;
452462

453-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
463+
tm = time_get_ptr(mrb, self);
454464
return mrb_fixnum_value(tm->datetime.tm_wday);
455465
}
456466

@@ -461,7 +471,7 @@ mrb_time_yday(mrb_state *mrb, mrb_value self)
461471
{
462472
struct mrb_time *tm;
463473

464-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
474+
tm = time_get_ptr(mrb, self);
465475
return mrb_fixnum_value(tm->datetime.tm_yday + 1);
466476
}
467477

@@ -472,7 +482,7 @@ mrb_time_year(mrb_state *mrb, mrb_value self)
472482
{
473483
struct mrb_time *tm;
474484

475-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
485+
tm = time_get_ptr(mrb, self);
476486
return mrb_fixnum_value(tm->datetime.tm_year + 1900);
477487
}
478488

@@ -483,7 +493,7 @@ mrb_time_zone(mrb_state *mrb, mrb_value self)
483493
{
484494
struct mrb_time *tm;
485495

486-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
496+
tm = time_get_ptr(mrb, self);
487497
if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value();
488498
if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value();
489499
return mrb_str_new_static(mrb,
@@ -501,7 +511,7 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self)
501511
char buf[256];
502512
int len;
503513

504-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
514+
tm = time_get_ptr(mrb, self);
505515
d = &tm->datetime;
506516
len = snprintf(buf, sizeof(buf), "%s %s %02d %02d:%02d:%02d %s%d",
507517
wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday,
@@ -518,8 +528,7 @@ mrb_time_day(mrb_state *mrb, mrb_value self)
518528
{
519529
struct mrb_time *tm;
520530

521-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
522-
if (!tm) return mrb_nil_value();
531+
tm = time_get_ptr(mrb, self);
523532
return mrb_fixnum_value(tm->datetime.tm_mday);
524533
}
525534

@@ -531,7 +540,7 @@ mrb_time_dst_p(mrb_state *mrb, mrb_value self)
531540
{
532541
struct mrb_time *tm;
533542

534-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
543+
tm = time_get_ptr(mrb, self);
535544
return mrb_bool_value(tm->datetime.tm_isdst);
536545
}
537546

@@ -543,7 +552,7 @@ mrb_time_getutc(mrb_state *mrb, mrb_value self)
543552
{
544553
struct mrb_time *tm, *tm2;
545554

546-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
555+
tm = time_get_ptr(mrb, self);
547556
tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm));
548557
*tm2 = *tm;
549558
tm2->timezone = MRB_TIMEZONE_UTC;
@@ -558,7 +567,7 @@ mrb_time_getlocal(mrb_state *mrb, mrb_value self)
558567
{
559568
struct mrb_time *tm, *tm2;
560569

561-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
570+
tm = time_get_ptr(mrb, self);
562571
tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm));
563572
*tm2 = *tm;
564573
tm2->timezone = MRB_TIMEZONE_LOCAL;
@@ -573,7 +582,7 @@ mrb_time_hour(mrb_state *mrb, mrb_value self)
573582
{
574583
struct mrb_time *tm;
575584

576-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
585+
tm = time_get_ptr(mrb, self);
577586
return mrb_fixnum_value(tm->datetime.tm_hour);
578587
}
579588

@@ -638,7 +647,7 @@ mrb_time_localtime(mrb_state *mrb, mrb_value self)
638647
{
639648
struct mrb_time *tm;
640649

641-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
650+
tm = time_get_ptr(mrb, self);
642651
tm->timezone = MRB_TIMEZONE_LOCAL;
643652
mrb_time_update_datetime(tm);
644653
return self;
@@ -651,7 +660,7 @@ mrb_time_mday(mrb_state *mrb, mrb_value self)
651660
{
652661
struct mrb_time *tm;
653662

654-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
663+
tm = time_get_ptr(mrb, self);
655664
return mrb_fixnum_value(tm->datetime.tm_mday);
656665
}
657666

@@ -662,7 +671,7 @@ mrb_time_min(mrb_state *mrb, mrb_value self)
662671
{
663672
struct mrb_time *tm;
664673

665-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
674+
tm = time_get_ptr(mrb, self);
666675
return mrb_fixnum_value(tm->datetime.tm_min);
667676
}
668677

@@ -673,7 +682,7 @@ mrb_time_mon(mrb_state *mrb, mrb_value self)
673682
{
674683
struct mrb_time *tm;
675684

676-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
685+
tm = time_get_ptr(mrb, self);
677686
return mrb_fixnum_value(tm->datetime.tm_mon + 1);
678687
}
679688

@@ -684,7 +693,7 @@ mrb_time_sec(mrb_state *mrb, mrb_value self)
684693
{
685694
struct mrb_time *tm;
686695

687-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
696+
tm = time_get_ptr(mrb, self);
688697
return mrb_fixnum_value(tm->datetime.tm_sec);
689698
}
690699

@@ -696,7 +705,7 @@ mrb_time_to_f(mrb_state *mrb, mrb_value self)
696705
{
697706
struct mrb_time *tm;
698707

699-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
708+
tm = time_get_ptr(mrb, self);
700709
return mrb_float_value(mrb, (mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6);
701710
}
702711

@@ -707,7 +716,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self)
707716
{
708717
struct mrb_time *tm;
709718

710-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
719+
tm = time_get_ptr(mrb, self);
711720
if (tm->sec > MRB_INT_MAX || tm->sec < MRB_INT_MIN) {
712721
return mrb_float_value(mrb, (mrb_float)tm->sec);
713722
}
@@ -721,7 +730,7 @@ mrb_time_usec(mrb_state *mrb, mrb_value self)
721730
{
722731
struct mrb_time *tm;
723732

724-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
733+
tm = time_get_ptr(mrb, self);
725734
if (tm->usec > MRB_INT_MAX || tm->usec < MRB_INT_MIN) {
726735
return mrb_float_value(mrb, (mrb_float)tm->usec);
727736
}
@@ -735,7 +744,7 @@ mrb_time_utc(mrb_state *mrb, mrb_value self)
735744
{
736745
struct mrb_time *tm;
737746

738-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
747+
tm = time_get_ptr(mrb, self);
739748
tm->timezone = MRB_TIMEZONE_UTC;
740749
mrb_time_update_datetime(tm);
741750
return self;
@@ -748,7 +757,7 @@ mrb_time_utc_p(mrb_state *mrb, mrb_value self)
748757
{
749758
struct mrb_time *tm;
750759

751-
tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
760+
tm = time_get_ptr(mrb, self);
752761
return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC);
753762
}
754763

0 commit comments

Comments
 (0)