diff options
| author | David Lamparter <equinox@opensourcerouting.org> | 2017-01-25 02:27:29 +0100 | 
|---|---|---|
| committer | David Lamparter <equinox@opensourcerouting.org> | 2017-01-25 02:27:29 +0100 | 
| commit | 83364d20d5667c3b43e1e672d2166c22b6fd8cf5 (patch) | |
| tree | c0e48ac257605cd47d80f79dcdd8a9555aaef322 /lib/command.c | |
| parent | ac9ddce37d16af4e36c1ff945c12aaaf615e69d8 (diff) | |
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.c')
| -rw-r--r-- | lib/command.c | 24 | 
1 files changed, 14 insertions, 10 deletions
diff --git a/lib/command.c b/lib/command.c index b5dae5f28e..781f627bb5 100644 --- a/lib/command.c +++ b/lib/command.c @@ -43,7 +43,10 @@  DEFINE_MTYPE(       LIB, HOST,       "Host config")  DEFINE_MTYPE(       LIB, STRVEC,     "String vector") -DEFINE_MTYPE_STATIC(LIB, CMD_TOKENS, "Command desc") +DEFINE_MTYPE_STATIC(LIB, CMD_TOKENS, "Command Tokens") +DEFINE_MTYPE_STATIC(LIB, CMD_DESC,   "Command Token Text") +DEFINE_MTYPE_STATIC(LIB, CMD_TEXT,   "Command Token Help") +DEFINE_MTYPE(       LIB, CMD_ARG,    "Command Argument")  /* Command vector which includes some level of command lists. Normally     each daemon maintains each own cmdvec. */ @@ -2405,13 +2408,14 @@ cmd_init (int terminal)  }  struct cmd_token * -new_cmd_token (enum cmd_token_type type, u_char attr, char *text, char *desc) +new_cmd_token (enum cmd_token_type type, u_char attr, +               const char *text, const char *desc)  {    struct cmd_token *token = XCALLOC (MTYPE_CMD_TOKENS, sizeof (struct cmd_token));    token->type = type;    token->attr = attr; -  token->text = text; -  token->desc = desc; +  token->text = text ? XSTRDUP (MTYPE_CMD_TEXT, text) : NULL; +  token->desc = desc ? XSTRDUP (MTYPE_CMD_DESC, desc) : NULL;    token->arg  = NULL;    token->allowrepeat = false; @@ -2424,11 +2428,11 @@ del_cmd_token (struct cmd_token *token)    if (!token) return;    if (token->text) -    XFREE (MTYPE_CMD_TOKENS, token->text); +    XFREE (MTYPE_CMD_TEXT, token->text);    if (token->desc) -    XFREE (MTYPE_CMD_TOKENS, token->desc); +    XFREE (MTYPE_CMD_DESC, token->desc);    if (token->arg) -    XFREE (MTYPE_CMD_TOKENS, token->arg); +    XFREE (MTYPE_CMD_ARG, token->arg);    XFREE (MTYPE_CMD_TOKENS, token);  } @@ -2439,9 +2443,9 @@ copy_cmd_token (struct cmd_token *token)    struct cmd_token *copy = new_cmd_token (token->type, token->attr, NULL, NULL);    copy->max   = token->max;    copy->min   = token->min; -  copy->text  = token->text ? XSTRDUP (MTYPE_CMD_TOKENS, token->text) : NULL; -  copy->desc  = token->desc ? XSTRDUP (MTYPE_CMD_TOKENS, token->desc) : NULL; -  copy->arg   = token->arg  ? XSTRDUP (MTYPE_CMD_TOKENS, token->arg) : NULL; +  copy->text  = token->text ? XSTRDUP (MTYPE_CMD_TEXT, token->text) : NULL; +  copy->desc  = token->desc ? XSTRDUP (MTYPE_CMD_DESC, token->desc) : NULL; +  copy->arg   = token->arg  ? XSTRDUP (MTYPE_CMD_ARG, token->arg) : NULL;    return copy;  }  | 
