From a2c2b549a759952349baaffcaa37caa647d59e71 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 28 Dec 2021 15:28:08 -0800 Subject: [PATCH] nstrftime: improve handling of invalid formats MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * lib/nstrftime.c (__strftime_internal): Without this change, ‘date +'%0_-+^#1%A'’ would output ‘%A’; with it, it outputs something like ‘%0_-+^#1Tuesday’ which is easier to debug and to write wrappers for (such as the nstrftime/fprintftime usage in GNU ‘date’). --- ChangeLog | 9 +++++++++ lib/nstrftime.c | 14 ++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 74a988abd2..ed9e63b851 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2021-12-28 Paul Eggert + + nstrftime: improve handling of invalid formats + * lib/nstrftime.c (__strftime_internal): Without this change, + ‘date +'%0_-+^#1%A'’ would output ‘%A’; with it, it outputs + something like ‘%0_-+^#1Tuesday’ which is easier to debug and to + write wrappers for (such as the nstrftime/fprintftime usage in GNU + ‘date’). + 2021-12-28 Bruno Haible unilbrk: Update handling of regional indicators for Unicode 10.0.0. diff --git a/lib/nstrftime.c b/lib/nstrftime.c index 25baf76c60..cc0b34bf99 100644 --- a/lib/nstrftime.c +++ b/lib/nstrftime.c @@ -651,6 +651,8 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) #endif /* ! DO_MULTIBYTE */ + char const *percent = f; + /* Check for flags that can modify a format. */ while (1) { @@ -752,8 +754,8 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) while (0) case L_('%'): - if (modifier != 0) - goto bad_format; + if (f - 1 != percent) + goto bad_percent; add1 (*f); break; @@ -1467,6 +1469,7 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) } case L_('\0'): /* GNU extension: % at end of format. */ + bad_percent: --f; FALLTHROUGH; default: @@ -1474,12 +1477,7 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) since this is most likely the right thing to do if a multibyte string has been misparsed. */ bad_format: - { - int flen; - for (flen = 1; f[1 - flen] != L_('%'); flen++) - continue; - cpy (flen, &f[1 - flen]); - } + cpy (f - percent + 1, percent); break; } } -- 2.39.5