summaryrefslogtreecommitdiffstats
path: root/lib/command_parse.y
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2017-01-25 02:27:29 +0100
committerDavid Lamparter <equinox@opensourcerouting.org>2017-01-25 02:27:29 +0100
commit83364d20d5667c3b43e1e672d2166c22b6fd8cf5 (patch)
treec0e48ac257605cd47d80f79dcdd8a9555aaef322 /lib/command_parse.y
parentMerge pull request #104 from opensourcerouting/time-cleanup (diff)
downloadfrr-83364d20d5667c3b43e1e672d2166c22b6fd8cf5.tar.xz
frr-83364d20d5667c3b43e1e672d2166c22b6fd8cf5.zip
lib: parser: fix memory management
command.c had: DEFINE_MTYPE_STATIC(LIB, CMD_TOKENS, "Command desc") while command_match.c had: DEFINE_MTYPE_STATIC(LIB, CMD_TOKENS, "Command Tokens") ... which means that there are 2 distinct MTYPE_CMD_TOKENS. (The description text being different does not matter, even with the same text it'd be 2 distinct types.) command_match.c allocates token->arg in command_match_r() while command.c frees it in del_cmd_token(). Therefore with each command being executed, the allocation count goes up on one, down on the other. => clean up parser allocation counting. Also, use separate MTYPEs for the different fields in struct cmd_token. Fixes: #108 / ee9216cf ("lib, ripngd: clean up merge leftovers") Signed-off-by: David Lamparter <equinox@opensourcerouting.org> Cc: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'lib/command_parse.y')
-rw-r--r--lib/command_parse.y31
1 files changed, 14 insertions, 17 deletions
diff --git a/lib/command_parse.y b/lib/command_parse.y
index c920e1138..7f98704f9 100644
--- a/lib/command_parse.y
+++ b/lib/command_parse.y
@@ -115,7 +115,7 @@
};
/* helper functions for parser */
- static char *
+ static const char *
doc_next (struct parser_ctx *ctx);
static struct graph_node *
@@ -130,8 +130,8 @@
static struct graph_node *
new_token_node (struct parser_ctx *,
enum cmd_token_type type,
- char *text,
- char *doc);
+ const char *text,
+ const char *doc);
static void
terminate_graph (struct parser_ctx *ctx,
@@ -222,7 +222,7 @@ compound_token:
literal_token: WORD
{
- $$ = new_token_node (ctx, WORD_TKN, strdup($1), doc_next(ctx));
+ $$ = new_token_node (ctx, WORD_TKN, $1, doc_next(ctx));
free ($1);
}
;
@@ -230,32 +230,32 @@ literal_token: WORD
placeholder_token:
IPV4
{
- $$ = new_token_node (ctx, IPV4_TKN, strdup($1), doc_next(ctx));
+ $$ = new_token_node (ctx, IPV4_TKN, $1, doc_next(ctx));
free ($1);
}
| IPV4_PREFIX
{
- $$ = new_token_node (ctx, IPV4_PREFIX_TKN, strdup($1), doc_next(ctx));
+ $$ = new_token_node (ctx, IPV4_PREFIX_TKN, $1, doc_next(ctx));
free ($1);
}
| IPV6
{
- $$ = new_token_node (ctx, IPV6_TKN, strdup($1), doc_next(ctx));
+ $$ = new_token_node (ctx, IPV6_TKN, $1, doc_next(ctx));
free ($1);
}
| IPV6_PREFIX
{
- $$ = new_token_node (ctx, IPV6_PREFIX_TKN, strdup($1), doc_next(ctx));
+ $$ = new_token_node (ctx, IPV6_PREFIX_TKN, $1, doc_next(ctx));
free ($1);
}
| VARIABLE
{
- $$ = new_token_node (ctx, VARIABLE_TKN, strdup($1), doc_next(ctx));
+ $$ = new_token_node (ctx, VARIABLE_TKN, $1, doc_next(ctx));
free ($1);
}
| RANGE
{
- $$ = new_token_node (ctx, RANGE_TKN, strdup($1), doc_next(ctx));
+ $$ = new_token_node (ctx, RANGE_TKN, $1, doc_next(ctx));
struct cmd_token *token = $$->data;
// get the numbers out
@@ -462,10 +462,7 @@ terminate_graph (struct parser_ctx *ctx, struct graph_node *finalnode)
// * -> finalnode -> END_TKN -> cmd_element
struct cmd_element *element = ctx->el;
struct graph_node *end_token_node =
- new_token_node (ctx,
- END_TKN,
- strdup (CMD_CR_TEXT),
- strdup (""));
+ new_token_node (ctx, END_TKN, CMD_CR_TEXT, "");
struct graph_node *end_element_node =
graph_new_node (ctx->graph, element, NULL);
@@ -476,7 +473,7 @@ terminate_graph (struct parser_ctx *ctx, struct graph_node *finalnode)
graph_add_edge (end_token_node, end_element_node);
}
-static char *
+static const char *
doc_next (struct parser_ctx *ctx)
{
const char *piece = ctx->docstr ? strsep (&ctx->docstr, "\n") : "";
@@ -486,12 +483,12 @@ doc_next (struct parser_ctx *ctx)
piece = "";
}
- return strdup (piece);
+ return piece;
}
static struct graph_node *
new_token_node (struct parser_ctx *ctx, enum cmd_token_type type,
- char *text, char *doc)
+ const char *text, const char *doc)
{
struct cmd_token *token = new_cmd_token (type, ctx->el->attr, text, doc);
return graph_new_node (ctx->graph, token, (void (*)(void *)) &del_cmd_token);