X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftime%2Flocaltime_r.c;h=1d43d9f4be41157b16fc8763ca06dbcc27058a8a;hb=6e89210669dfc93302a181a80ed440132e41f0dd;hp=2bf10378830f18d1a222b8104e1c134e712872a2;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01;p=oweals%2Fmusl.git diff --git a/src/time/localtime_r.c b/src/time/localtime_r.c index 2bf10378..1d43d9f4 100644 --- a/src/time/localtime_r.c +++ b/src/time/localtime_r.c @@ -1,11 +1,21 @@ -#include +#include "time_impl.h" +#include +#include "libc.h" -#include "__time.h" - -struct tm *localtime_r(const time_t *t, struct tm *result) +struct tm *__localtime_r(const time_t *restrict t, struct tm *restrict tm) { - __tzset(); - __time_to_tm(*t - __timezone, result); - result->tm_isdst = -1; - return __dst_adjust(result); + /* 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 = EOVERFLOW; + return 0; + } + return tm; } + +weak_alias(__localtime_r, localtime_r);