diff options
author | Denys Vlasenko | 2012-03-07 11:57:47 +0100 |
---|---|---|
committer | Denys Vlasenko | 2012-03-07 11:57:47 +0100 |
commit | 69d81a1c1b2e4881b751ee24f8eb70c0dfaa05d9 (patch) | |
tree | b71b6fb3ba32baf73d862b19db991e4d3e5e1c59 | |
parent | d4acaf70c586ea72fce0e4af4cba87d4a6d00655 (diff) | |
download | busybox-69d81a1c1b2e4881b751ee24f8eb70c0dfaa05d9.zip busybox-69d81a1c1b2e4881b751ee24f8eb70c0dfaa05d9.tar.gz |
printf: fix this case: printf "%b" '\0057usr\0057bin\n'
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@googlemail.com>
-rw-r--r-- | 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); } } |