[PATCH v1 1/4] cli: run_commandf(): small fixups

Simon Glass sjg at chromium.org
Fri Mar 10 21:49:48 CET 2023


Hi Evgeny,

On Fri, 10 Mar 2023 at 10:55, Evgeny Bachinin <EABachinin at sberdevices.ru> wrote:
>
> * vsnprintf() can truncate cmd, hence it makes no sense to launch such
> command (it's broken). Moreover, it's better to signalize to the caller
> about such case (for facilitating debugging or bug hunting).
>
> * Fix kernel-doc warnings:
>   include/command.h:264: info: Scanning doc for run_commandf
>   include/command.h:268: warning: contents before sections
>   include/command.h:271: warning: No description found for return value
>                                   of 'run_commandf'
>
> * Add printf-like format attribute to validate at compile-time the format
> string against parameters's type.
>
> * Fix compilation error in case of -Wall, -Werror, -Wextra:
> error: variable ‘i’ set but not used [-Werror=unused-but-set-variable]
>
> * Drop extra ret variable.
>
> Signed-off-by: Evgeny Bachinin <EABachinin at sberdevices.ru>
> ---
>  common/cli.c      | 19 ++++++++++++++-----
>  include/command.h | 13 ++++++++++---
>  2 files changed, 24 insertions(+), 8 deletions(-)

Reviewed-by: Simon Glass <sjg at chromium.org>

People are more used to using CONFIG_SYS_CBSIZE for the max cmdline
size, but I suppose this is fine. You could perhaps do a follow-on to
adjust this to use console_buffer[] ?

nits below

>
> diff --git a/common/cli.c b/common/cli.c
> index 9451e6a142..3db4e0f0b7 100644
> --- a/common/cli.c
> +++ b/common/cli.c
> @@ -8,6 +8,8 @@
>   * JinHua Luo, GuangDong Linux Center, <luo.jinhua at gd-linux.com>
>   */
>
> +#define pr_fmt(fmt) "cli: %s: " fmt, __func__
> +
>  #include <common.h>
>  #include <bootstage.h>
>  #include <cli.h>
> @@ -20,6 +22,7 @@
>  #include <malloc.h>
>  #include <asm/global_data.h>
>  #include <dm/ofnode.h>
> +#include <linux/errno.h>
>
>  #ifdef CONFIG_CMDLINE
>  /*
> @@ -130,15 +133,21 @@ int run_commandf(const char *fmt, ...)
>  {
>         va_list args;
>         char cmd[128];
> -       int i, ret;
> +       int nbytes;
>
>         va_start(args, fmt);
> -       i = vsnprintf(cmd, sizeof(cmd), fmt, args);
> +       nbytes = vsnprintf(cmd, sizeof(cmd), fmt, args);
>         va_end(args);
>
> -       ret = run_command(cmd, 0);
> -
> -       return ret;
> +       if (nbytes < 0) {
> +               pr_err("I/O internal error occurred.\n");
> +               return -EIO;

This can't really happen, so to reduce code size, how about pr_debug() ?

> +       } else if ((size_t)nbytes >= sizeof(cmd)) {
> +               pr_err("'fmt' size:%d exceeds the limit(%zu)\n",
> +                      nbytes, sizeof(cmd));
> +               return -EINVAL;

-ENOSPC perhaps? Then the caller can handle the message and this can
become pr_debug() as well.


> +       }
> +       return run_command(cmd, 0);
>  }
>
>  /****************************************************************************/
> diff --git a/include/command.h b/include/command.h
> index 0db4898062..6c0c97054c 100644
> --- a/include/command.h
> +++ b/include/command.h
> @@ -13,6 +13,8 @@
>  #include <env.h>
>  #include <linker_lists.h>
>
> +#include <linux/compiler_attributes.h>
> +
>  #ifndef NULL
>  #define NULL   0
>  #endif
> @@ -260,12 +262,17 @@ int run_command_repeatable(const char *cmd, int flag);
>  /**
>   * run_commandf() - Run a command created by a format string
>   *
> - * The command cannot be larger than 127 characters
> - *
>   * @fmt: printf() format string
>   * @...: Arguments to use (flag is always 0)
> + *
> + * The command cannot be larger than 127 characters
> + *
> + * Return:
> + * Returns 0 on success, -EIO if internal output error occurred, -EINVAL in
> + *     case of 'fmt' string truncation, or != 0 on error, specific for
> + *     run_command().
>   */
> -int run_commandf(const char *fmt, ...);
> +int run_commandf(const char *fmt, ...) __printf(1, 2);
>
>  /**
>   * Run a list of commands separated by ; or even \0
> --
> 2.17.1
>


More information about the U-Boot mailing list