]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
lib/date: Make rtc_mktime and mktime64 Y2038-ready
authorJan Kiszka <jan.kiszka@siemens.com>
Sun, 24 Apr 2022 09:34:56 +0000 (11:34 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 5 May 2022 19:06:02 +0000 (15:06 -0400)
We currently overflow due to wrong types used internally in rtc_mktime,
on all platforms, and we return a too small type on 32-bit.

One consumer that directly benefits from this is mktime64. Many others
may still store the result in a wrong type.

While at it, drop the redundant cast of mon in rtc_mktime (obsoleted by
714209832db1).

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
include/linux/time.h
include/rtc.h
lib/date.c

index 702dd276aea5e857a112b42fa6ab1f2efed59e27..14ff5b6f481844f5c99bb466589fde412e183cf8 100644 (file)
@@ -152,9 +152,6 @@ _DEFUN (ctime_r, (tim_p, result),
     return asctime_r (localtime_r (tim_p, &tm), result);
 }
 
-/* for compatibility with linux code */
-typedef __s64 time64_t;
-
 #ifdef CONFIG_LIB_DATE
 time64_t mktime64(const unsigned int year, const unsigned int mon,
                  const unsigned int day, const unsigned int hour,
index 6c7fcadd48852a5e8b08086a1159d417fe6f9277..10104e3bf5a904e9c67b11c14782642aa30d9627 100644 (file)
@@ -16,6 +16,8 @@
 #include <bcd.h>
 #include <rtc_def.h>
 
+typedef int64_t time64_t;
+
 #ifdef CONFIG_DM_RTC
 
 struct udevice;
@@ -301,7 +303,7 @@ int rtc_calc_weekday(struct rtc_time *time);
 void rtc_to_tm(u64 time_t, struct rtc_time *time);
 
 /**
- * rtc_mktime() - Convert a broken-out time into a time_t value
+ * rtc_mktime() - Convert a broken-out time into a time64_t value
  *
  * The following fields need to be valid for this function to work:
  *     tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year
@@ -309,9 +311,9 @@ void rtc_to_tm(u64 time_t, struct rtc_time *time);
  * Note that tm_wday and tm_yday are ignored.
  *
  * @time:      Broken-out time to convert
- * Return: corresponding time_t value, seconds since 1970-01-01 00:00:00
+ * Return: corresponding time64_t value, seconds since 1970-01-01 00:00:00
  */
-unsigned long rtc_mktime(const struct rtc_time *time);
+time64_t rtc_mktime(const struct rtc_time *time);
 
 /**
  * rtc_month_days() - The number of days in the month
index c589d9ed3a2c4d0e5769f1e42bf2eca79b25bc7d..e3d22459cd058ad6c936c82d16dcd952515b1131 100644 (file)
@@ -71,19 +71,16 @@ int rtc_calc_weekday(struct rtc_time *tm)
  * -year / 100 + year / 400 terms, and add 10.]
  *
  * This algorithm was first published by Gauss (I think).
- *
- * WARNING: this function will overflow on 2106-02-07 06:28:16 on
- * machines where long is 32-bit! (However, as time_t is signed, we
- * will already get problems at other places on 2038-01-19 03:14:08)
  */
-unsigned long rtc_mktime(const struct rtc_time *tm)
+time64_t rtc_mktime(const struct rtc_time *tm)
 {
        int mon = tm->tm_mon;
        int year = tm->tm_year;
-       int days, hours;
+       unsigned long days;
+       time64_t hours;
 
        mon -= 2;
-       if (0 >= (int)mon) {    /* 1..12 -> 11, 12, 1..10 */
+       if (0 >= mon) {         /* 1..12 -> 11, 12, 1..10 */
                mon += 12;      /* Puts Feb last since it has leap day */
                year -= 1;
        }
@@ -109,5 +106,5 @@ time64_t mktime64(const unsigned int year, const unsigned int mon,
        time.tm_min = min;
        time.tm_sec = sec;
 
-       return (time64_t)rtc_mktime((const struct rtc_time *)&time);
+       return rtc_mktime((const struct rtc_time *)&time);
 }