]> granicus.if.org Git - postgresql/commitdiff
Modernize zic's test for valid timezone abbreviations.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 26 Mar 2016 19:58:44 +0000 (15:58 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 26 Mar 2016 19:58:44 +0000 (15:58 -0400)
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.

src/timezone/zic.c

index 1a7ec68d7c04d893debe877ef9f268ed6e49ca60..9fc20c6bac7bf405e6ac0b52f2feded79179597d 100644 (file)
@@ -2792,30 +2792,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)