Ignoring symlinks when recovering time zone identifiers in initdb

From: Florian Weimer <fw(at)deneb(dot)enyo(dot)de>
To: pgsql-hackers(at)postgresql(dot)org
Cc: Andrew Gierth <rhodiumtoad(at)postgresql(dot)org>
Subject: Ignoring symlinks when recovering time zone identifiers in initdb
Date: 2025-09-14 07:49:04
Message-ID: 87v7llzd73.fsf@mid.deneb.enyo.de
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

There's a story making the rounds that the removal of the
/usr/share/zoneinfo/US/Pacific etc. in Debian broke installations.
These identifiers should not be used, but they may get picked by
initdb if they are shorter than the alternatives. The length-based
tie breaking was introduced in commit e3846a00c2f ("Prefer timezone
name "UTC" over alternative spellings.").

Would it make sense to ignore symbolic links when searching for the
time zone identifier under /usr/share/zoneinfo in scan_available_timezones?

Something like this (untested):

diff --git a/src/bin/initdb/findtimezone.c b/src/bin/initdb/findtimezone.c
index 2b2ae39adf3..e492e904993 100644
--- a/src/bin/initdb/findtimezone.c
+++ b/src/bin/initdb/findtimezone.c
@@ -677,7 +677,11 @@ scan_available_timezones(char *tzdir, char *tzdirsub, struct tztry *tt,
snprintf(tzdir + tzdir_orig_len, MAXPGPATH - tzdir_orig_len,
"/%s", name);

- if (stat(tzdir, &statbuf) != 0)
+ /*
+ * Ignore symbolic links, so that shorter aliases in directories such
+ * as "US" are not preferred over the "America" directory.
+ */
+ if (lstat(tzdir, &statbuf) != 0)
{
#ifdef DEBUG_IDENTIFY_TIMEZONE
fprintf(stderr, "could not stat \"%s\": %m\n",
@@ -693,7 +697,7 @@ scan_available_timezones(char *tzdir, char *tzdirsub, struct tztry *tt,
scan_available_timezones(tzdir, tzdirsub, tt,
bestscore, bestzonename);
}
- else
+ else if (S_ISREG(statbuf.st_mode))
{
/* Load and test this file */
int score = score_timezone(tzdirsub, tt);

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Dilip Kumar 2025-09-14 08:09:51 Re: Incorrect logic in XLogNeedsFlush()
Previous Message Dilip Kumar 2025-09-14 06:53:12 Re: Proposal: Conflict log history table for Logical Replication