From 3a6ecb82b5f1ee670cd3bca505256f25d339e7d5 Mon Sep 17 00:00:00 2001 From: buxiasen Date: Mon, 11 Nov 2024 23:26:04 +0800 Subject: [PATCH] nshlib/nsh_parse: Fix variable arguments concat error of `nsh_execute()` Without this patch nsh> set time 5 nsh> echo $time 5 nsh> sleep $time & sh [5:100] nsh> nsh: sleep: missing required argument(s) With this patch nsh> set time 5 nsh> echo $time 5 nsh> sleep $time & sh [4:100] nsh> ps PID GROUP PRI POLICY TYPE NPX STATE EVENT SIGMASK STACK COMMAND 0 0 0 FIFO Kthread - Ready 0000000000000000 0069616 Idle_Task 1 0 224 FIFO Kthread - Waiting Signal 0000000000000000 0067536 loop_task 2 0 224 FIFO Kthread - Waiting Semaphore 0000000000000000 0067504 hpwork 0x501760e0 0x50176128 3 3 100 FIFO Task - Running 0000000000000000 0067536 nsh_main 4 4 100 FIFO Task - Waiting Signal 0000000000000000 0067520 sh -c sleep Signed-off-by: buxiasen Signed-off-by: wangjianyu3 --- nshlib/nsh_parse.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/nshlib/nsh_parse.c b/nshlib/nsh_parse.c index 655f0fb85..a75ee5e87 100644 --- a/nshlib/nsh_parse.c +++ b/nshlib/nsh_parse.c @@ -603,24 +603,25 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, { FAR char *sh_argv[4]; FAR char *sh_cmd = "sh"; - int i; + char sh_arg2[CONFIG_NSH_LINELEN]; DEBUGASSERT(strncmp(argv[0], sh_cmd, 3) != 0); - sh_argv[0] = sh_cmd; - sh_argv[1] = "-c"; - for (i = 0; i < argc - 1; i++) + sh_arg2[0] = '\0'; + + for (ret = 0; ret < argc; ret++) { - FAR char *p_arg = argv[i]; - size_t len = strlen(p_arg); + strlcat(sh_arg2, argv[ret], sizeof(sh_arg2)); - /* Restore from split args to concat args. */ - - DEBUGASSERT(&p_arg[len + 1] == argv[i + 1]); - p_arg[len] = ' '; + if (ret < argc - 1) + { + strcat(sh_arg2, " "); + } } - sh_argv[2] = argv[0]; + sh_argv[0] = sh_cmd; + sh_argv[1] = "-c"; + sh_argv[2] = sh_arg2; sh_argv[3] = NULL; /* np.np_bg still there, try use nsh_builtin or nsh_fileapp to