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
@@ -944,7 +944,14 @@ 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);
+ 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)
