|
Message-Id: <20161103022936.13564-1-dsabogalcc@gmail.com> Date: Wed, 2 Nov 2016 22:29:36 -0400 From: Daniel Sabogal <dsabogalcc@...il.com> To: musl@...ts.openwall.com Subject: [PATCH v2] fix integer overflow of tm_year in __secs_to_tm From: Daniel Sabogal <dsabogal@....edu> 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. --- v2: Subtract 12 from months, not 10. #include <time.h> #include <stdio.h> extern int __secs_to_tm(long long t, struct tm *tm); int main(void) { struct tm tm = {0}; if (__secs_to_tm(67768036191676800LL, &tm) < 0) return 1; printf("%d\n", tm.tm_year); } src/time/__secs_to_tm.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/time/__secs_to_tm.c b/src/time/__secs_to_tm.c index 3a3123a..c1cc28c 100644 --- a/src/time/__secs_to_tm.c +++ b/src/time/__secs_to_tm.c @@ -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; -- 2.10.1
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.