[PATCH] printf: short-circuit output when argument to %b includes \c

Denys Vlasenko vda.linux at googlemail.com
Sun Jan 31 21:24:15 UTC 2016


Applied, thanks

On Thu, Jan 21, 2016 at 11:28 AM, Ron Yorston <rmy at pobox.com> wrote:
> 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'.
>
> Signed-off-by: Ron Yorston <rmy at pobox.com>
> ---
>  coreutils/printf.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/coreutils/printf.c b/coreutils/printf.c
> index 3dd43a9..9ee7350 100644
> --- a/coreutils/printf.c
> +++ b/coreutils/printf.c
> @@ -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;
> --
> 2.5.0
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox


More information about the busybox mailing list