]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
time-util: refuse non-zero gmtoff with non-UTC timezone 26649/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 3 Mar 2023 07:00:59 +0000 (16:00 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 3 Mar 2023 11:39:19 +0000 (20:39 +0900)
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

src/basic/time-util.c

index a76bb6bc5790ed31fcad1190278a80f58f0407a7..26fd1bae6533bad887dfab35dcb6f57a50005646 100644 (file)
@@ -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. */