X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Ftime%2Flocaltime_r.c;h=2e62c29fb2ac1bccaf5af0f045a5bbf5ffefc880;hb=cb229f614f937515b78e40701f36c26c7def01b7;hp=b36c1d825f077f2f53c427b6f683fb03f475b936;hpb=1cc81f5cb0df2b66a795ff0c26d7bbc4d16e13c6;p=musl diff --git a/src/time/localtime_r.c b/src/time/localtime_r.c index b36c1d82..2e62c29f 100644 --- a/src/time/localtime_r.c +++ b/src/time/localtime_r.c @@ -4,9 +4,15 @@ struct tm *__localtime_r(const time_t *restrict t, struct tm *restrict tm) { + /* Reject time_t values whose year would overflow int because + * __secs_to_zone cannot safely handle them. */ + if (*t < INT_MIN * 31622400LL || *t > INT_MAX * 31622400LL) { + errno = EOVERFLOW; + return 0; + } __secs_to_zone(*t, 0, &tm->tm_isdst, &tm->__tm_gmtoff, 0, &tm->__tm_zone); - if (__secs_to_tm((long long)*t - tm->__tm_gmtoff, tm) < 0) { - errno = EINVAL; + if (__secs_to_tm((long long)*t + tm->__tm_gmtoff, tm) < 0) { + errno = EOVERFLOW; return 0; } return tm;