Ignoring symlinks when recovering time zone identifiers in initdb
От | Florian Weimer |
---|---|
Тема | Ignoring symlinks when recovering time zone identifiers in initdb |
Дата | |
Msg-id | 87v7llzd73.fsf@mid.deneb.enyo.de обсуждение исходный текст |
Ответы |
Re: Ignoring symlinks when recovering time zone identifiers in initdb
|
Список | 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);
В списке pgsql-hackers по дате отправления: