[PATCH] printf: allow 0 as a flag and allow multiple flags
Ron Yorston
rmy at pobox.com
Thu Dec 16 11:19:03 UTC 2021
The '%' character in a format specification may be followed by
one or more flags from the list "+- #0". BusyBox printf didn't
support the '0' flag or allow multiple flags to be provided.
As a result the formats '%0*d' and '%0 d' were considered to be
invalid.
The lack of support for '0' was pointed out by Andrew Snyder on the
musl mailing list:
https://www.openwall.com/lists/musl/2021/12/14/2
function old new delta
printf_main 860 891 +31
.rodata 99281 99282 +1
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 32/0) Total: 32 bytes
Signed-off-by: Ron Yorston <rmy at pobox.com>
---
coreutils/printf.c | 8 +++++---
testsuite/printf.tests | 10 ++++++++++
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/coreutils/printf.c b/coreutils/printf.c
index dd94c8ade..e5cf5f942 100644
--- a/coreutils/printf.c
+++ b/coreutils/printf.c
@@ -313,9 +313,11 @@ static char **print_formatted(char *f, char **argv, int *conv_err)
}
break;
}
- if (*f && strchr("-+ #", *f)) {
- ++f;
- ++direc_length;
+ if (*f) {
+ while (strchr("-+ #0", *f)) {
+ ++f;
+ ++direc_length;
+ }
}
if (*f == '*') {
++f;
diff --git a/testsuite/printf.tests b/testsuite/printf.tests
index 050edef71..728bbf4bf 100755
--- a/testsuite/printf.tests
+++ b/testsuite/printf.tests
@@ -143,4 +143,14 @@ testing "printf aborts on %r" \
"printf: %r: invalid format\n""1\n" \
"" ""
+testing "printf treats leading 0 as flag" \
+ "${bb}printf '%0*d\n' 2 1 2>&1; echo \$?" \
+ "01\n""0\n" \
+ "" ""
+
+testing "printf handles multiple flags" \
+ "${bb}printf '%0 d\n' 2 2>&1; echo \$?" \
+ " 2\n""0\n" \
+ "" ""
+
exit $FAILCOUNT
--
2.33.1
More information about the busybox
mailing list