[git commit] printf: allow 0 as a flag and allow multiple flags

Denys Vlasenko vda.linux at googlemail.com
Fri Dec 17 20:13:26 UTC 2021


commit: https://git.busybox.net/busybox/commit/?id=7105e4afddbf47b494accce40e2a701b8833e6ce
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 coreutils/printf.c     |  2 +-
 testsuite/printf.tests | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/coreutils/printf.c b/coreutils/printf.c
index dd94c8ade..2e672d15f 100644
--- a/coreutils/printf.c
+++ b/coreutils/printf.c
@@ -313,7 +313,7 @@ static char **print_formatted(char *f, char **argv, int *conv_err)
 				}
 				break;
 			}
-			if (*f && strchr("-+ #", *f)) {
+			while (*f && strchr("-+ #0", *f)) {
 				++f;
 				++direc_length;
 			}
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


More information about the busybox-cvs mailing list