summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <p.w.stephenson@ntlworld.com>2015-11-22 18:14:13 +0000
committerPeter Stephenson <p.w.stephenson@ntlworld.com>2015-11-22 18:14:13 +0000
commitacbd2ca701ea6b91e3f3a710daa7e32295edc225 (patch)
tree24bc755ed62a06bb383b27ca76b43414c3ae0a59 /Src
parent544144debee50937de3bd345b2840c2f864dcb5d (diff)
downloadzsh-acbd2ca701ea6b91e3f3a710daa7e32295edc225.tar.gz
zsh-acbd2ca701ea6b91e3f3a710daa7e32295edc225.tar.xz
zsh-acbd2ca701ea6b91e3f3a710daa7e32295edc225.zip
37191: fix strftime() expansion issue with %p and %P.
In some locales the output from this can validly be empty, so
we need to treat them specially.
Diffstat (limited to 'Src')
-rw-r--r--Src/utils.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/Src/utils.c b/Src/utils.c
index 0afa8c908..464097034 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -3143,6 +3143,7 @@ strftimehandling:
 		 * in the accounting in bufsize (but nowhere else).
 		 */
 		{
+		    char origchar = fmt[-1];
 		    int size = fmt - fmtstart;
 		    char *tmp, *last;
 		    tmp = zhalloc(size + 1);
@@ -3163,11 +3164,17 @@ strftimehandling:
 		    *buf = '\1';
 		    if (!strftime(buf, bufsize + 2, tmp, tm))
 		    {
-			if (*buf) {
-			    buf[0] = '\0';
-			    return -1;
+			/*
+			 * Some locales don't have strings for
+			 * AM/PM, so empty output is valid.
+			 */
+			if (*buf || (origchar != 'p' && origchar != 'P')) {
+			    if (*buf) {
+				buf[0] = '\0';
+				return -1;
+			    }
+			    return 0;
 			}
-			return 0;
 		    }
 		    decr = strlen(buf);
 		    buf += decr;