From 92287e2b148e4861278cb1489bdc19a321c4614b Mon Sep 17 00:00:00 2001 From: Norman Rasmussen Date: Fri, 31 Dec 2021 06:54:57 -0800 Subject: [PATCH] Fix some edge case bugs in nsh_parse - Handle nsh_filecat returning NULL on failure - Background and redirect must be restored after an empty line - Output redirection should be removed from argv like background --- nshlib/nsh_parse.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/nshlib/nsh_parse.c b/nshlib/nsh_parse.c index 8b51181c5..bca4c6cff 100644 --- a/nshlib/nsh_parse.c +++ b/nshlib/nsh_parse.c @@ -943,8 +943,15 @@ static FAR char *nsh_cmdparm(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, /* Concatenate the file contents with the current allocation */ - argument = nsh_filecat(vtbl, *allocation, tmpfile); - *allocation = argument; + argument = nsh_filecat(vtbl, *allocation, tmpfile); + if (argument == NULL) + { + argument = (FAR char *)g_nullstring; + } + else + { + *allocation = argument; + } /* We can now unlink the tmpfile and free the tmpfile string */ @@ -2305,8 +2312,8 @@ static int nsh_parse_cmdparm(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, * status. */ - NSH_MEMLIST_FREE(&memlist); - return OK; + ret = 0; + goto exit; } /* Parse all of the arguments following the command name. The form @@ -2346,6 +2353,7 @@ static int nsh_parse_cmdparm(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline, /* Restore the backgrounding and redirection state */ +exit: #ifndef CONFIG_NSH_DISABLEBG vtbl->np.np_bg = bgsave; #endif @@ -2522,17 +2530,12 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) } } - /* Last argument vector must be empty */ - - argv[argc] = NULL; - /* Check if the command should run in background */ #ifndef CONFIG_NSH_DISABLEBG if (argc > 1 && strcmp(argv[argc - 1], "&") == 0) { vtbl->np.np_bg = true; - argv[argc - 1] = NULL; argc--; } #endif @@ -2566,6 +2569,10 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) } #endif + /* Last argument vector must be empty */ + + argv[argc] = NULL; + /* Check if the maximum number of arguments was exceeded */ if (argc > CONFIG_NSH_MAXARGUMENTS)