X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Ftime%2Flocaltime_r.c;h=1a15b314d0f1209db127a9f1b50229249a11515c;hb=41149ea8c7a6f28a1c60478fe7f6b9552aa39e3b;hp=c52678fdfeb38fde2684f93cb8a58eaabda3ac1b;hpb=ea81c0624f0213430ae8fb959e30373eeaaf391c;p=musl diff --git a/src/time/localtime_r.c b/src/time/localtime_r.c index c52678fd..1a15b314 100644 --- a/src/time/localtime_r.c +++ b/src/time/localtime_r.c @@ -1,11 +1,17 @@ #include "time_impl.h" #include -#include "libc.h" +#include 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) { + if (__secs_to_tm((long long)*t + tm->__tm_gmtoff, tm) < 0) { errno = EOVERFLOW; return 0; }