diff options
author | Ron Yorston <rmy@pobox.com> | 2016-01-31 22:22:25 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2016-01-31 22:23:05 +0100 |
commit | 4a79224cfcde1c941f581d0c61edaf293e743af5 (patch) | |
tree | 6f10b991128b4f4c1a83bf61b33ebacfcb0ef802 /coreutils | |
parent | 2a4bba3ce2e00e55e6690fa8ba2607679277eed4 (diff) | |
download | busybox-w32-4a79224cfcde1c941f581d0c61edaf293e743af5.tar.gz busybox-w32-4a79224cfcde1c941f581d0c61edaf293e743af5.tar.bz2 busybox-w32-4a79224cfcde1c941f581d0c61edaf293e743af5.zip |
printf: short-circuit output when argument to %b includes \c
printf wasn't correctly handling \c in an argument to the %b format
specifier.
printf %bXX OK\\c
returned 'OK\cXX' rather than the expected 'OK'.
function old new delta
printf_main 886 899 +13
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/printf.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/coreutils/printf.c b/coreutils/printf.c index 3dd43a978..9ee7350d0 100644 --- a/coreutils/printf.c +++ b/coreutils/printf.c | |||
@@ -131,8 +131,8 @@ static double my_xstrtod(const char *arg) | |||
131 | return result; | 131 | return result; |
132 | } | 132 | } |
133 | 133 | ||
134 | /* Handles %b */ | 134 | /* Handles %b; return 1 if output is to be short-circuited by \c */ |
135 | static void print_esc_string(const char *str) | 135 | static int print_esc_string(const char *str) |
136 | { | 136 | { |
137 | char c; | 137 | char c; |
138 | while ((c = *str) != '\0') { | 138 | while ((c = *str) != '\0') { |
@@ -145,6 +145,9 @@ static void print_esc_string(const char *str) | |||
145 | str++; | 145 | str++; |
146 | } | 146 | } |
147 | } | 147 | } |
148 | else if (*str == 'c') { | ||
149 | return 1; | ||
150 | } | ||
148 | { | 151 | { |
149 | /* optimization: don't force arg to be on-stack, | 152 | /* optimization: don't force arg to be on-stack, |
150 | * use another variable for that. */ | 153 | * use another variable for that. */ |
@@ -155,6 +158,8 @@ static void print_esc_string(const char *str) | |||
155 | } | 158 | } |
156 | putchar(c); | 159 | putchar(c); |
157 | } | 160 | } |
161 | |||
162 | return 0; | ||
158 | } | 163 | } |
159 | 164 | ||
160 | static void print_direc(char *format, unsigned fmt_length, | 165 | static void print_direc(char *format, unsigned fmt_length, |
@@ -280,7 +285,8 @@ static char **print_formatted(char *f, char **argv, int *conv_err) | |||
280 | } | 285 | } |
281 | if (*f == 'b') { | 286 | if (*f == 'b') { |
282 | if (*argv) { | 287 | if (*argv) { |
283 | print_esc_string(*argv); | 288 | if (print_esc_string(*argv)) |
289 | return saved_argv; /* causes main() to exit */ | ||
284 | ++argv; | 290 | ++argv; |
285 | } | 291 | } |
286 | break; | 292 | break; |