diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2016-03-26 15:58:44 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2016-03-26 15:59:37 -0400 |
commit | 528f112b049b22c72f1d16f22754585254d6115b (patch) | |
tree | c01ad22ca8310e7bf1f443e4ad4fdfbd67221960 | |
parent | e5fd35cc54720c25c748d4cdf2c89f094865ad48 (diff) | |
download | postgresql-528f112b049b22c72f1d16f22754585254d6115b.tar.gz postgresql-528f112b049b22c72f1d16f22754585254d6115b.zip |
Modernize zic's test for valid timezone abbreviations.
We really need to sync all of our IANA-derived timezone code with upstream,
but that's going to be a large patch and I certainly don't care to shove
such a thing into stable branches immediately before a release. As a
stopgap, copy just the tzcode2016c logic that checks validity of timezone
abbreviations. This prevents getting multiple "time zone abbreviation
differs from POSIX standard" bleats with tzdata 2014b and later.
-rw-r--r-- | src/timezone/zic.c | 25 |
1 files changed, 5 insertions, 20 deletions
diff --git a/src/timezone/zic.c b/src/timezone/zic.c index 8a95d6ac3f7..9fdc263603c 100644 --- a/src/timezone/zic.c +++ b/src/timezone/zic.c @@ -2771,30 +2771,15 @@ newabbr(const char *string) const char *cp; char *wp; - /* - * Want one to ZIC_MAX_ABBR_LEN_WO_WARN alphabetics optionally - * followed by a + or - and a number from 1 to 14. - */ cp = string; wp = NULL; - while (isascii((unsigned char) *cp) && - isalpha((unsigned char) *cp)) + while (isalpha((unsigned char) *cp) || ('0' <= *cp && *cp <= '9') + || *cp == '-' || *cp == '+') ++cp; - if (cp - string == 0) - wp = _("time zone abbreviation lacks alphabetic at start"); - if (noise && cp - string > 3) - wp = _("time zone abbreviation has more than 3 alphabetics"); + if (noise && cp - string < 3) + wp = _("time zone abbreviation has fewer than 3 characters"); if (cp - string > ZIC_MAX_ABBR_LEN_WO_WARN) - wp = _("time zone abbreviation has too many alphabetics"); - if (wp == NULL && (*cp == '+' || *cp == '-')) - { - ++cp; - if (isascii((unsigned char) *cp) && - isdigit((unsigned char) *cp)) - if (*cp++ == '1' && - *cp >= '0' && *cp <= '4') - ++cp; - } + wp = _("time zone abbreviation has too many characters"); if (*cp != '\0') wp = _("time zone abbreviation differs from POSIX standard"); if (wp != NULL) |