From 7a68106ec50515c54505348d494642de897a9416 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 26 Mar 2016 15:58:44 -0400
Subject: [PATCH] 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.
---
 src/timezone/zic.c | 25 +++++--------------------
 1 file 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)
-- 
GitLab