aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/cli.c25
-rw-r--r--include/command.h13
2 files changed, 29 insertions, 9 deletions
diff --git a/common/cli.c b/common/cli.c
index 9451e6a1426..3916a7b10a7 100644
--- a/common/cli.c
+++ b/common/cli.c
@@ -8,6 +8,8 @@
* JinHua Luo, GuangDong Linux Center, <luo.jinhua@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
/*
@@ -129,16 +132,26 @@ int run_command_list(const char *cmd, int len, int flag)
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);
+ /*
+ * Limit the console_buffer space being used to CONFIG_SYS_CBSIZE,
+ * because its last byte is used to fit the replacement of \0 by \n\0
+ * in underlying hush parser
+ */
+ nbytes = vsnprintf(console_buffer, CONFIG_SYS_CBSIZE, fmt, args);
va_end(args);
- ret = run_command(cmd, 0);
-
- return ret;
+ if (nbytes < 0) {
+ pr_debug("I/O internal error occurred.\n");
+ return -EIO;
+ } else if (nbytes >= CONFIG_SYS_CBSIZE) {
+ pr_debug("'fmt' size:%d exceeds the limit(%d)\n",
+ nbytes, CONFIG_SYS_CBSIZE);
+ return -ENOSPC;
+ }
+ return run_command(console_buffer, 0);
}
/****************************************************************************/
diff --git a/include/command.h b/include/command.h
index 1b018cb98e7..c4e3170967d 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 (CONFIG_SYS_CBSIZE - 1) characters.
+ *
+ * Return:
+ * Returns 0 on success, -EIO if internal output error occurred, -ENOSPC 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