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
This commit is contained in:
parent
6993c66389
commit
92287e2b14
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user