rtc: Fix overflow when converting time64_t to rtc_time
If we convert one large time values to rtc_time, in the original formula 'days * 86400' can be overflowed in 'unsigned int' type to make the formula get one incorrect remain seconds value. Thus we can use div_s64_rem() function to avoid this situation. Signed-off-by: Baolin Wang <baolin.wang@linaro.org> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
parent
29a1f599c0
commit
36d46cdb43
|
@ -52,13 +52,11 @@ EXPORT_SYMBOL(rtc_year_days);
|
||||||
*/
|
*/
|
||||||
void rtc_time64_to_tm(time64_t time, struct rtc_time *tm)
|
void rtc_time64_to_tm(time64_t time, struct rtc_time *tm)
|
||||||
{
|
{
|
||||||
unsigned int month, year;
|
unsigned int month, year, secs;
|
||||||
unsigned long secs;
|
|
||||||
int days;
|
int days;
|
||||||
|
|
||||||
/* time must be positive */
|
/* time must be positive */
|
||||||
days = div_s64(time, 86400);
|
days = div_s64_rem(time, 86400, &secs);
|
||||||
secs = time - (unsigned int) days * 86400;
|
|
||||||
|
|
||||||
/* day of the week, 1970-01-01 was a Thursday */
|
/* day of the week, 1970-01-01 was a Thursday */
|
||||||
tm->tm_wday = (days + 4) % 7;
|
tm->tm_wday = (days + 4) % 7;
|
||||||
|
|
Loading…
Reference in New Issue