summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2021-12-28 15:28:08 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2021-12-28 15:29:37 -0800
commita2c2b549a759952349baaffcaa37caa647d59e71 (patch)
tree50dbfafc29a98ec33b3c79c3af331f6ba35d9310 /lib
parentbc8ed44229e292980637474d2f26a6fb54d4d7bf (diff)
downloadgnulib-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.c14
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;
}
}