diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2021-12-28 15:28:08 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2021-12-28 15:29:37 -0800 |
commit | a2c2b549a759952349baaffcaa37caa647d59e71 (patch) | |
tree | 50dbfafc29a98ec33b3c79c3af331f6ba35d9310 /lib | |
parent | bc8ed44229e292980637474d2f26a6fb54d4d7bf (diff) | |
download | gnulib-a2c2b549a759952349baaffcaa37caa647d59e71.tar.gz |
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’).
Diffstat (limited to 'lib')
-rw-r--r-- | lib/nstrftime.c | 14 |
1 files changed, 6 insertions, 8 deletions
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; } } |