From: Yu Watanabe Date: Fri, 3 Mar 2023 07:00:59 +0000 (+0900) Subject: time-util: refuse non-zero gmtoff with non-UTC timezone X-Git-Tag: v254-rc1~1127^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F26649%2Fhead;p=thirdparty%2Fsystemd.git time-util: refuse non-zero gmtoff with non-UTC timezone Also this moves the range check for gmtoff to parse_timestamp_impl(), to address the post-merge comment: https://github.com/systemd/systemd/pull/26409#discussion_r1118650190 --- diff --git a/src/basic/time-util.c b/src/basic/time-util.c index a76bb6bc579..26fd1bae653 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -679,6 +679,15 @@ static int parse_timestamp_impl( with_tz = true; } + if (utc) { + /* glibc accepts gmtoff more than 24 hours, but we refuse it. */ + if ((usec_t) labs(gmtoff) * USEC_PER_SEC > USEC_PER_DAY) + return -EINVAL; + } else { + if (gmtoff != 0) + return -EINVAL; + } + if (t[0] == '@' && !with_tz) return parse_sec(t + 1, ret); @@ -948,13 +957,8 @@ int parse_timestamp(const char *t, usec_t *ret) { * UTC and shift the result. Note, this must be earlier than the timezone check with tzname[], as * tzname[] may be in the same format. */ k = strptime(tz, "%z", &tm); - if (k && *k == '\0') { - /* glibc accepts gmtoff more than 24 hours, but we refuse it. */ - if ((usec_t) labs(tm.tm_gmtoff) > USEC_PER_DAY / USEC_PER_SEC) - return -EINVAL; - + if (k && *k == '\0') return parse_timestamp_impl(t, tz_offset, /* utc = */ true, /* isdst = */ -1, /* gmtoff = */ tm.tm_gmtoff, ret); - } /* If the last word is not a timezone file (e.g. Asia/Tokyo), then let's check if it matches * tzname[] of the local timezone, e.g. JST or CEST. */