提交 f89e2982 编写于 作者: R Rich Felker

fix hangs in localtime for near-overflowing time_t values on 64-bit archs

上级 0311d1dd
...@@ -4,6 +4,12 @@ ...@@ -4,6 +4,12 @@
struct tm *__localtime_r(const time_t *restrict t, struct tm *restrict tm) 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); __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; errno = EOVERFLOW;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册