Depending on the packaging of tzdata, /usr/share/zoneinfo/tzdata.zi may
reference zones or links that are not actually present on the system.
E.g. on Debian and Ubuntu, there is a tzdata-legacy package that
contains "legacy" zones and links, but they are still referenced in
/usr/share/zoneinfo/tzdata.zi shipped by the main tzdata package.
Right now, get_timezoes() does not validate timezones when building the
list, which makes the following possible:
$ timedatectl list-timezones | grep "US/Alaska"
US/Alaska
$ timedatectl set-timezone US/Alaska
Failed to set time zone: Invalid or not installed time zone 'US/Alaska'
which feels buggy. Hence, simply validate timezones in get_timezones()
to avoid listing timezones that are not installed.
if (*cc == '#')
continue;
+ if (!timezone_is_valid(tz, LOG_DEBUG))
+ /* Don't list unusable timezones. */
+ continue;
+
r = strv_extend(&zones, tz);
if (r < 0)
return r;
/* Not a line we care about. */
continue;
+ if (!timezone_is_valid(tz, LOG_DEBUG))
+ /* Don't list unusable timezones. */
+ continue;
+
r = strv_extend(&zones, tz);
if (r < 0)
return r;