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)