diff mbox series

[v2,11/12] cli: Support macro processing with a fixed-size buffer

Message ID 20201105173349.903603-12-sjg@chromium.org
State Accepted
Commit 1a62d64c7de7e7de3facf221eb8408ddfb675cb8
Delegated to: Tom Rini
Headers show
Series bootm: Support substitions in bootargs and add tests | expand

Commit Message

Simon Glass Nov. 5, 2020, 5:33 p.m. UTC
At present cli_simple_process_macros() requires that the caller provide
an output buffer that is exactly CONFIG_SYS_CBSIZE bytes in length. This
makes sense since it is designed to be used from the command line. But we
also want to use it for bootargs substitution.

Update the function to allow the caller to specify the buffer size. Also
return an error if the buffer is exhausted. The caller can ignore that if
preferred.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Add a new patch to support macro processing with a fixed-size buffer

 cmd/pxe_utils.c     |  6 ++++--
 common/cli_simple.c | 17 ++++++++++++-----
 include/cli.h       |  4 +++-
 3 files changed, 19 insertions(+), 8 deletions(-)

Comments

Tom Rini Dec. 7, 2020, 10:19 p.m. UTC | #1
On Thu, Nov 05, 2020 at 10:33:47AM -0700, Simon Glass wrote:

> At present cli_simple_process_macros() requires that the caller provide
> an output buffer that is exactly CONFIG_SYS_CBSIZE bytes in length. This
> makes sense since it is designed to be used from the command line. But we
> also want to use it for bootargs substitution.
> 
> Update the function to allow the caller to specify the buffer size. Also
> return an error if the buffer is exhausted. The caller can ignore that if
> preferred.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/next, thanks!
diff mbox series

Patch

diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c
index 8716e782f6a..69cac149c0c 100644
--- a/cmd/pxe_utils.c
+++ b/cmd/pxe_utils.c
@@ -322,7 +322,8 @@  static int label_localboot(struct pxe_label *label)
 	if (label->append) {
 		char bootargs[CONFIG_SYS_CBSIZE];
 
-		cli_simple_process_macros(label->append, bootargs);
+		cli_simple_process_macros(label->append, bootargs,
+					  sizeof(bootargs));
 		env_set("bootargs", bootargs);
 	}
 
@@ -430,7 +431,8 @@  static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label)
 		strcat(bootargs, ip_str);
 		strcat(bootargs, mac_str);
 
-		cli_simple_process_macros(bootargs, finalbootargs);
+		cli_simple_process_macros(bootargs, finalbootargs,
+					  sizeof(finalbootargs));
 		env_set("bootargs", finalbootargs);
 		printf("append: %s\n", finalbootargs);
 	}
diff --git a/common/cli_simple.c b/common/cli_simple.c
index 7d91316a0fb..e80ba488a5e 100644
--- a/common/cli_simple.c
+++ b/common/cli_simple.c
@@ -60,13 +60,14 @@  int cli_simple_parse_line(char *line, char *argv[])
 	return nargs;
 }
 
-void cli_simple_process_macros(const char *input, char *output)
+int cli_simple_process_macros(const char *input, char *output, int max_size)
 {
 	char c, prev;
 	const char *varname_start = NULL;
 	int inputcnt = strlen(input);
-	int outputcnt = CONFIG_SYS_CBSIZE;
+	int outputcnt = max_size;
 	int state = 0;		/* 0 = waiting for '$'  */
+	int ret;
 
 	/* 1 = waiting for '(' or '{' */
 	/* 2 = waiting for ')' or '}' */
@@ -157,13 +158,18 @@  void cli_simple_process_macros(const char *input, char *output)
 		prev = c;
 	}
 
-	if (outputcnt)
+	ret = inputcnt ? -ENOSPC : 0;
+	if (outputcnt) {
 		*output = 0;
-	else
+	} else {
 		*(output - 1) = 0;
+		ret = -ENOSPC;
+	}
 
 	debug_parser("[PROCESS_MACROS] OUTPUT len %zd: \"%s\"\n",
 		     strlen(output_start), output_start);
+
+	return ret;
 }
 
  /*
@@ -239,7 +245,8 @@  int cli_simple_run_command(const char *cmd, int flag)
 		debug_parser("token: \"%s\"\n", token);
 
 		/* find macros in this token and replace them */
-		cli_simple_process_macros(token, finaltoken);
+		cli_simple_process_macros(token, finaltoken,
+					  sizeof(finaltoken));
 
 		/* Extract arguments */
 		argc = cli_simple_parse_line(finaltoken, argv);
diff --git a/include/cli.h b/include/cli.h
index 39b913743b5..3449fa6ae72 100644
--- a/include/cli.h
+++ b/include/cli.h
@@ -34,8 +34,10 @@  int cli_simple_run_command(const char *cmd, int flag);
  *
  * @param input		Input string possible containing $() / ${} vars
  * @param output	Output string with $() / ${} vars expanded
+ * @param max_size	Maximum size of @output (including terminator)
+ * @return 0 if OK, -ENOSPC if we ran out of space in @output
  */
-void cli_simple_process_macros(const char *input, char *output);
+int cli_simple_process_macros(const char *input, char *output, int max_size);
 
 /**
  * cli_simple_run_command_list() - Execute a list of command