From acbd2ca701ea6b91e3f3a710daa7e32295edc225 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 22 Nov 2015 18:14:13 +0000 Subject: 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. --- ChangeLog | 3 +++ Src/utils.c | 15 +++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2c50e05f8..558af14dc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2015-11-22 Peter Stephenson + * 37191: Src/utils.c: some locales prduce valid empty output for + strtfime escapes %p and %P. + * 37188: Test/B09hash.ztst: new test. * 37187: Src/builtin.c: infinite loop in "hash -m". 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; -- cgit 1.4.1