]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: stop assigning colon prefixed timezone to $TZ 39160/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 28 Sep 2025 01:19:08 +0000 (10:19 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 28 Sep 2025 02:14:00 +0000 (11:14 +0900)
glibc (and also musl, though we do not officially support it yet)
silently ignores colon prefix in $TZ. Let's always not prefix the
timezone.

tzset(3) states:
> A nonempty value of TZ can be one of two formats, either of which can
> be preceded by a colon which is ignored.

Addresses https://github.com/systemd/systemd/pull/38876#discussion_r2384347594.

src/basic/time-util.c
src/shared/calendarspec.c
src/test/test-time-util.c
src/timedate/timedatectl.c

index fb54ba276c1d4177283cf2ab42742915f86db14d..e54c829623e26363083a691e7ae2514dc47d8620 100644 (file)
@@ -1022,7 +1022,7 @@ int parse_timestamp(const char *t, usec_t *ret) {
         if (timezone_is_valid(tz, LOG_DEBUG)) {
                 SAVE_TIMEZONE;
 
-                if (setenv("TZ", strjoina(":", tz), /* overwrite = */ true) < 0)
+                if (setenv("TZ", tz, /* overwrite = */ true) < 0)
                         return negative_errno();
 
                 return parse_timestamp_impl(t, max_len, /* utc = */ false, /* isdst = */ -1, /* gmtoff = */ 0, ret);
index b15f9290367c6f0c3d64ba0903a74efcf91647c6..0e12e55a97718fe4b3ec25f92a465816fd7254e1 100644 (file)
@@ -1436,10 +1436,7 @@ int calendar_spec_next_usec(const CalendarSpec *spec, usec_t usec, usec_t *ret_n
 
         SAVE_TIMEZONE;
 
-        /* tzset(3) says $TZ should be prefixed with ":" if we reference timezone files */
-        const char *colon_tz = strjoina(":", spec->timezone);
-
-        r = RET_NERRNO(setenv("TZ", colon_tz, 1));
+        r = RET_NERRNO(setenv("TZ", spec->timezone, /* overwrite = */ true));
         if (r < 0)
                 return r;
 
index 7569f89ca0d6b3ee2e7f17165d52343825d5688f..7bcf0ae7ee313063dd68223806488760c877e17f 100644 (file)
 #define TRIAL 100u
 
 static void set_timezone(const char *tz) {
-        if (!tz)
-                ASSERT_OK_ERRNO(unsetenv("TZ"));
-        if (isempty(tz))
-                ASSERT_OK_ERRNO(setenv("TZ", tz, /* overwrite = */ true));
-        else
-                ASSERT_OK_ERRNO(setenv("TZ", strjoina(":", tz), /* overwrite = */ true));
-
+        ASSERT_OK(set_unset_env("TZ", tz, /* overwrite = */ true));
         tzset();
         log_info("TZ=%s, tzname[0]=%s, tzname[1]=%s", strna(getenv("TZ")), strempty(tzname[0]), strempty(tzname[1]));
 }
@@ -421,7 +415,7 @@ static void test_format_timestamp_impl(usec_t x) {
          * timezone may provide time shifted 1 hour from the original. See
          * https://github.com/systemd/systemd/issues/28472 and https://github.com/systemd/systemd/pull/35471 */
         bool ignore =
-                streq_ptr(getenv("TZ"), ":Africa/Windhoek") &&
+                streq_ptr(getenv("TZ"), "Africa/Windhoek") &&
                 (x_sec > y_sec ? x_sec - y_sec : y_sec - x_sec) == 3600;
 
         log_full(ignore ? LOG_WARNING : LOG_ERR,
@@ -1113,14 +1107,14 @@ TEST(usec_shift_clock) {
 TEST(in_utc_timezone) {
         SAVE_TIMEZONE;
 
-        assert_se(setenv("TZ", ":UTC", 1) >= 0);
+        assert_se(setenv("TZ", "UTC", 1) >= 0);
         assert_se(in_utc_timezone());
         ASSERT_STREQ(tzname[0], "UTC");
         ASSERT_STREQ(tzname[1], "UTC");
         assert_se(timezone == 0);
         assert_se(daylight == 0);
 
-        assert_se(setenv("TZ", ":Europe/Berlin", 1) >= 0);
+        assert_se(setenv("TZ", "Europe/Berlin", 1) >= 0);
         assert_se(!in_utc_timezone());
         ASSERT_STREQ(tzname[0], "CET");
         ASSERT_STREQ(tzname[1], "CEST");
index f3a8046bede35b0690a723ffd848b70b02219f81..0e8e705a500d0769adc4a49e9a1a39dc408f8183 100644 (file)
@@ -58,7 +58,6 @@ typedef struct StatusInfo {
 
 static int print_status_info(const StatusInfo *i) {
         _cleanup_(table_unrefp) Table *table = NULL;
-        const char *tz_colon;
         char a[LINE_MAX];
         TableCell *cell;
         struct tm tm;
@@ -82,8 +81,7 @@ static int print_status_info(const StatusInfo *i) {
         SAVE_TIMEZONE;
 
         /* Set the new $TZ */
-        tz_colon = strjoina(":", isempty(i->timezone) ? "UTC" : i->timezone);
-        if (setenv("TZ", tz_colon, true) < 0)
+        if (setenv("TZ", isempty(i->timezone) ? "UTC" : i->timezone, /* overwrite = */ true) < 0)
                 log_warning_errno(errno, "Failed to set TZ environment variable, ignoring: %m");
         else
                 tzset();