]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Null-terminate tab completions char*[]
authorQuentin Young <qlyoung@cumulusnetworks.com>
Sun, 2 Oct 2016 03:27:58 +0000 (03:27 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Sun, 2 Oct 2016 03:27:58 +0000 (03:27 +0000)
vtysh expects the result of a tab completion to
have a null pointer as the last element

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
lib/command.c

index 9d68f33989f034bd399b60e0399bf3193770d751..405cf6de665df399f0f88ad0cb8f851ad86e04cb 100644 (file)
@@ -618,8 +618,9 @@ cmd_complete_command_lib (vector vline, struct vty *vty, int *status, int islib)
 
       // get token completions
       vector comps = cmd_complete_command_real (shifted_vline, vty, status);
-      ret = XMALLOC (MTYPE_TMP, vector_active (comps) * sizeof (char *));
-      for (unsigned int i = 0; i < vector_active (comps); i++)
+      ret = XMALLOC (MTYPE_TMP, vector_active (comps) * sizeof (char *) + 1);
+      unsigned int i;
+      for (i = 0; i < vector_active (comps); i++)
         {
           struct cmd_token *token = vector_slot (comps, i);
           ret[i] = XSTRDUP (MTYPE_TMP, token->text);
@@ -627,6 +628,7 @@ cmd_complete_command_lib (vector vline, struct vty *vty, int *status, int islib)
           del_cmd_token (token);
         }
       vector_free (comps);
+      ret[i] = NULL;
 
       vector_free(shifted_vline);
       vty->node = onode;
@@ -635,14 +637,16 @@ cmd_complete_command_lib (vector vline, struct vty *vty, int *status, int islib)
 
   // get token completions
   vector comps = cmd_complete_command_real (vline, vty, status);
-  ret = XMALLOC (MTYPE_TMP, vector_active (comps) * sizeof (char *));
-  for (unsigned int i = 0; i < vector_active (comps); i++)
+  ret = XMALLOC (MTYPE_TMP, vector_active (comps) * sizeof (char *) + 1);
+  unsigned int i;
+  for (i = 0; i < vector_active (comps); i++)
     {
       struct cmd_token *token = vector_slot (comps, i);
       ret[i] = XSTRDUP (MTYPE_TMP, token->text);
       vector_unset (comps, i);
       del_cmd_token (token);
     }
+  ret[i] = NULL;
   vector_free (comps);
 
   return ret;