Commit c492471d authored by Baolin Wang's avatar Baolin Wang Committed by Greg Kroah-Hartman

rtc: Fix overflow when converting time64_t to rtc_time

commit 36d46cdb upstream.

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: 's avatarBaolin Wang <baolin.wang@linaro.org>
Acked-by: 's avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: 's avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: 's avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: 's avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 421abdcc
......@@ -52,13 +52,11 @@ EXPORT_SYMBOL(rtc_year_days);
*/
void rtc_time64_to_tm(time64_t time, struct rtc_time *tm)
{
unsigned int month, year;
unsigned long secs;
unsigned int month, year, secs;
int days;
/* time must be positive */
days = div_s64(time, 86400);
secs = time - (unsigned int) days * 86400;
days = div_s64_rem(time, 86400, &secs);
/* day of the week, 1970-01-01 was a Thursday */
tm->tm_wday = (days + 4) % 7;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment