[git commit] printf: fix this case: printf "%b" '\0057usr\0057bin\n'

Denys Vlasenko vda.linux at googlemail.com
Wed Mar 7 10:57:47 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=69d81a1c1b2e4881b751ee24f8eb70c0dfaa05d9
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

It was not accepting \0NNN. Standard printf tool does.

function                                             old     new   delta
printf_main                                          869     886     +17

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 coreutils/printf.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/coreutils/printf.c b/coreutils/printf.c
index 1437951..3dd43a9 100644
--- a/coreutils/printf.c
+++ b/coreutils/printf.c
@@ -131,13 +131,28 @@ static double my_xstrtod(const char *arg)
 	return result;
 }
 
+/* Handles %b */
 static void print_esc_string(const char *str)
 {
 	char c;
 	while ((c = *str) != '\0') {
 		str++;
-		if (c == '\\')
-			c = bb_process_escape_sequence(&str);
+		if (c == '\\') {
+			/* %b also accepts 4-digit octals of the form \0### */
+			if (*str == '0') {
+				if ((unsigned char)(str[1] - '0') < 8) {
+					/* 2nd char is 0..7: skip leading '0' */
+					str++;
+				}
+			}
+			{
+				/* optimization: don't force arg to be on-stack,
+				 * use another variable for that. */
+				const char *z = str;
+				c = bb_process_escape_sequence(&z);
+				str = z;
+			}
+		}
 		putchar(c);
 	}
 }


More information about the busybox-cvs mailing list