summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-03-26 15:58:44 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-03-26 15:59:31 -0400
commit7a68106ec50515c54505348d494642de897a9416 (patch)
treeb63f7d0f866f41295266017845959473e9907f57
parent96fa3745912cfe7d6cb57fb7145755b11b84eab0 (diff)
downloadpostgresql-7a68106ec50515c54505348d494642de897a9416.tar.gz
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.c25
1 files changed, 5 insertions, 20 deletions
diff --git a/src/timezone/zic.c b/src/timezone/zic.c
index 8a95d6ac3f..9fdc263603 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)