mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-01 00:49:43 +00:00
lib/date: Make rtc_mktime and mktime64 Y2038-ready
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
714209832d
).
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
parent
bfae2744dd
commit
90c52423be
3 changed files with 10 additions and 14 deletions
|
@ -152,9 +152,6 @@ _DEFUN (ctime_r, (tim_p, result),
|
||||||
return asctime_r (localtime_r (tim_p, &tm), result);
|
return asctime_r (localtime_r (tim_p, &tm), result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for compatibility with linux code */
|
|
||||||
typedef __s64 time64_t;
|
|
||||||
|
|
||||||
#ifdef CONFIG_LIB_DATE
|
#ifdef CONFIG_LIB_DATE
|
||||||
time64_t mktime64(const unsigned int year, const unsigned int mon,
|
time64_t mktime64(const unsigned int year, const unsigned int mon,
|
||||||
const unsigned int day, const unsigned int hour,
|
const unsigned int day, const unsigned int hour,
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
#include <bcd.h>
|
#include <bcd.h>
|
||||||
#include <rtc_def.h>
|
#include <rtc_def.h>
|
||||||
|
|
||||||
|
typedef int64_t time64_t;
|
||||||
|
|
||||||
#ifdef CONFIG_DM_RTC
|
#ifdef CONFIG_DM_RTC
|
||||||
|
|
||||||
struct udevice;
|
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);
|
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:
|
* The following fields need to be valid for this function to work:
|
||||||
* tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year
|
* 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.
|
* Note that tm_wday and tm_yday are ignored.
|
||||||
*
|
*
|
||||||
* @time: Broken-out time to convert
|
* @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
|
* rtc_month_days() - The number of days in the month
|
||||||
|
|
13
lib/date.c
13
lib/date.c
|
@ -71,19 +71,16 @@ int rtc_calc_weekday(struct rtc_time *tm)
|
||||||
* -year / 100 + year / 400 terms, and add 10.]
|
* -year / 100 + year / 400 terms, and add 10.]
|
||||||
*
|
*
|
||||||
* This algorithm was first published by Gauss (I think).
|
* 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 mon = tm->tm_mon;
|
||||||
int year = tm->tm_year;
|
int year = tm->tm_year;
|
||||||
int days, hours;
|
unsigned long days;
|
||||||
|
time64_t hours;
|
||||||
|
|
||||||
mon -= 2;
|
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 */
|
mon += 12; /* Puts Feb last since it has leap day */
|
||||||
year -= 1;
|
year -= 1;
|
||||||
}
|
}
|
||||||
|
@ -109,5 +106,5 @@ time64_t mktime64(const unsigned int year, const unsigned int mon,
|
||||||
time.tm_min = min;
|
time.tm_min = min;
|
||||||
time.tm_sec = sec;
|
time.tm_sec = sec;
|
||||||
|
|
||||||
return (time64_t)rtc_mktime((const struct rtc_time *)&time);
|
return rtc_mktime((const struct rtc_time *)&time);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue