You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/01/01 14:18:15 UTC
[incubator-nuttx-apps] 01/02: Fix some edge case bugs in nsh_parse
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git
commit 92287e2b148e4861278cb1489bdc19a321c4614b
Author: Norman Rasmussen <no...@rasmussen.co.za>
AuthorDate: Fri Dec 31 06:54:57 2021 -0800
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 8b51181..bca4c6c 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)