Patrick Georgi has submitted this change. ( https://review.coreboot.org/c/coreboot/+/54913 )
Change subject: lib/rtc: Add sanity check for time and date ......................................................................
lib/rtc: Add sanity check for time and date
Add a function to check sanity of a given RTC date and time. Invalid values in terms of overrun ranges of the registers can lead to strange issues in the OS.
Change-Id: I0a381d445c894eee4f82b50fe86dad22cc587605 Signed-off-by: Werner Zeh werner.zeh@siemens.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/54913 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Arthur Heymans arthur@aheymans.xyz Reviewed-by: Paul Menzel paulepanter@mailbox.org --- M src/include/rtc.h M src/lib/rtc.c 2 files changed, 17 insertions(+), 0 deletions(-)
Approvals: build bot (Jenkins): Verified Paul Menzel: Looks good to me, but someone else must approve Arthur Heymans: Looks good to me, approved
diff --git a/src/include/rtc.h b/src/include/rtc.h index 0a38074..6d562f7 100644 --- a/src/include/rtc.h +++ b/src/include/rtc.h @@ -21,5 +21,6 @@ int rtc_to_tm(int tim, struct rtc_time *tm); unsigned long rtc_mktime(const struct rtc_time *tm); void rtc_display(const struct rtc_time *tm); +int rtc_invalid(const struct rtc_time *tm);
#endif /* _RTC_H_ */ diff --git a/src/lib/rtc.c b/src/lib/rtc.c index c5fffa0..d151480 100644 --- a/src/lib/rtc.c +++ b/src/lib/rtc.c @@ -121,3 +121,19 @@ (tm->wday < 0 || tm->wday > 6) ? "unknown " : weekdays[tm->wday], tm->hour, tm->min, tm->sec); } + +static int rtc_month_days(unsigned int month, unsigned int year) +{ + int month_days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + return month_days[month] + (LEAP_YEAR(year) && month == 2); +} + +int rtc_invalid(const struct rtc_time *tm) +{ + if (tm->sec > 59 || tm->min > 59 || tm->hour > 23 || tm->mon == 0 || tm->mon > 12 || + tm->year < 1970 || tm->mday > rtc_month_days(tm->mon - 1, tm->year)) + return 1; + else + return 0; +}