From: Quentin Young Date: Tue, 13 Sep 2016 19:55:37 +0000 (+0000) Subject: lib: Fix various memory leaks X-Git-Tag: frr-3.0-branchpoint~129^2~231 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=795d02785aa3f6d1638d79cfdaa5e45ed2ff8199;p=matthieu%2Ffrr.git lib: Fix various memory leaks Signed-off-by: Quentin Young --- diff --git a/lib/command_match.c b/lib/command_match.c index 75780de2c5..cd2200e0c0 100644 --- a/lib/command_match.c +++ b/lib/command_match.c @@ -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; } diff --git a/lib/grammar_sandbox.c b/lib/grammar_sandbox.c index 1fe46a87e5..5e01e6c05b 100644 --- a/lib/grammar_sandbox.c +++ b/lib/grammar_sandbox.c @@ -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)