fix integer overflow of tm_year in __secs_to_tm
authorDaniel Sabogal <dsabogal@ufl.edu>
Thu, 3 Nov 2016 02:29:36 +0000 (22:29 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 7 Nov 2016 18:00:54 +0000 (13:00 -0500)
the overflow check for years+100 did not account for the extra
year computed from the remaining months. instead, perform this
check after obtaining the final number of years.

src/time/__secs_to_tm.c

index 3a3123a..093d902 100644 (file)
@@ -60,15 +60,16 @@ int __secs_to_tm(long long t, struct tm *tm)
        for (months=0; days_in_month[months] <= remdays; months++)
                remdays -= days_in_month[months];
 
+       if (months >= 10) {
+               months -= 12;
+               years++;
+       }
+
        if (years+100 > INT_MAX || years+100 < INT_MIN)
                return -1;
 
        tm->tm_year = years + 100;
        tm->tm_mon = months + 2;
-       if (tm->tm_mon >= 12) {
-               tm->tm_mon -=12;
-               tm->tm_year++;
-       }
        tm->tm_mday = remdays + 1;
        tm->tm_wday = wday;
        tm->tm_yday = yday;