]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Fix various memory leaks
authorQuentin Young <qlyoung@cumulusnetworks.com>
Tue, 13 Sep 2016 19:55:37 +0000 (19:55 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Tue, 13 Sep 2016 19:55:37 +0000 (19:55 +0000)
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
lib/command_match.c
lib/grammar_sandbox.c

index 75780de2c52b4599cdb349351955ff56347c00d0..cd2200e0c01210d96474c05c8cc4ec88be2220c7 100644 (file)
@@ -101,14 +101,17 @@ command_match (struct graph *cmdgraph,
   struct graph_node *start = vector_slot (cmdgraph->nodes, 0);
   if ((*argv = command_match_r (start, vvline, 0))) // successful match
     {
+      struct listnode *head = listhead (*argv);
+      struct listnode *tail = listtail (*argv);
+
       // delete dummy start node
-      list_delete_node (*argv, listhead (*argv));
+      del_cmd_token ((struct cmd_token_t *) head->data);
+      list_delete_node (*argv, head);
+
       // get cmd_element out of list tail
-      struct listnode *tail = listtail (*argv);
       *el = listgetdata (tail);
-      // delete list tail
-      tail->data = NULL;
       list_delete_node (*argv, tail);
+
       // now argv is an ordered list of cmd_token matching the user
       // input, with each cmd_token->arg holding the corresponding input
       assert (*el);
@@ -290,7 +293,7 @@ command_complete (struct graph *graph,
   unsigned int idx;
   for (idx = 0; idx < vector_active (vline) && next->count > 0; idx++)
     {
-      list_free (current);
+      list_delete (current);
       current = next;
       next = list_new();
 
@@ -334,8 +337,8 @@ command_complete (struct graph *graph,
   for (ALL_LIST_ELEMENTS_RO (next,node,gn))
     listnode_add (*completions, gn->data);
 
-  list_free (current);
-  list_free (next);
+  list_delete (current);
+  list_delete (next);
 
   return matcher_rv;
 }
index 1fe46a87e51efc31165d490665a02c8d73d0b19f..5e01e6c05b1b02111ffb5386789ffd4cfbec0722 100644 (file)
@@ -84,7 +84,7 @@ DEFUN (grammar_test_complete,
   vector command = cmd_make_strvec (cmdstr);
 
   // generate completions of user input
-  struct list *completions = list_new ();
+  struct list *completions;
   enum matcher_rv result = command_complete (nodegraph, command, &completions);
 
   // print completions or relevant error message
@@ -106,6 +106,10 @@ DEFUN (grammar_test_complete,
         tkn = vector_slot (comps, i);
         fprintf (stdout, "  %-*s  %s%s", width, tkn->text, tkn->desc, "\n");
       }
+
+      for (i = 0; i < vector_active (comps); i++)
+        del_cmd_token ((struct cmd_token_t *) vector_slot (comps, i));
+      vector_free (comps);
     }
   else
     fprintf (stdout, "%% No match%s", "\n");
@@ -147,6 +151,7 @@ DEFUN (grammar_test_match,
       fprintf (stdout, "func: %p%s", element->func, "\n");
 
       list_delete (argvv);
+      del_cmd_element (element);
     }
   else {
      assert(MATCHER_ERROR(result));
@@ -167,8 +172,8 @@ DEFUN (grammar_test_match,
   }
 
   // free resources
-  cmd_free_strvec(command);
-  free(cmdstr);
+  cmd_free_strvec (command);
+  free (cmdstr);
 
   return CMD_SUCCESS;
 }
@@ -351,6 +356,7 @@ new_cmd_token (enum cmd_token_type_t type, char *text, char *desc)
 void
 del_cmd_token (struct cmd_token_t *token)
 {
+  fprintf (stdout, "deleting token\n");
   if (!token) return;
 
   if (token->text)