printf: short-circuit output when argument to %b includes \c
No binary (build failed)
—
(log yok)
| @@ -131,8 +131,8 @@ static double my_xstrtod(const char *arg) | |
| return result; | |
| } | |
| - | /* Handles %b */ |
| - | static void print_esc_string(const char *str) |
| + | /* Handles %b; return 1 if output is to be short-circuited by \c */ |
| + | static int print_esc_string(const char *str) |
| { | |
| char c; | |
| while ((c = *str) != '\0') { | |
| @@ -145,6 +145,9 @@ static void print_esc_string(const char *str) | |
| str++; | |
| } | |
| } | |
| + | else if (*str == 'c') { |
| + | return 1; |
| + | } |
| { | |
| /* optimization: don't force arg to be on-stack, | |
| * use another variable for that. */ | |
| @@ -155,6 +158,8 @@ static void print_esc_string(const char *str) | |
| } | |
| putchar(c); | |
| } | |
| + | |
| + | return 0; |
| } | |
| static void print_direc(char *format, unsigned fmt_length, | |
| @@ -280,7 +285,8 @@ static char **print_formatted(char *f, char **argv, int *conv_err) | |
| } | |
| if (*f == 'b') { | |
| if (*argv) { | |
| - | print_esc_string(*argv); |
| + | if (print_esc_string(*argv)) |
| + | return saved_argv; /* causes main() to exit */ |
| ++argv; | |
| } | |
| break; | |