Avoid memory leaks on struct cmd_list_element.doc field.
* cli/cli-decode.c (add_alias_cmd): Make a copy of doc field if flags contains DOC_ALLOCATED. (add_setshow_cmd_full): Add DOC_ALLOCATED to set and show flags. (delete_cmd): Handle DOC_ALLOCATED flag. * cli/cli-decode.h (DOC_ALLOCATED): New macro for use in flags filed of struct cmd_list_element. (struct cmd_list_element): Document new flag item.
This commit is contained in:
parent
ad288036a7
commit
5bc81a00b6
3 changed files with 28 additions and 1 deletions
|
@ -1,3 +1,15 @@
|
|||
2012-12-05 Pierre Muller <muller@sourceware.org>
|
||||
|
||||
Avoid memory leaks on struct cmd_list_element.doc field.
|
||||
* cli/cli-decode.c (add_alias_cmd): Make a copy of doc field
|
||||
if flags contains DOC_ALLOCATED.
|
||||
(add_setshow_cmd_full): Add DOC_ALLOCATED to set and show
|
||||
flags.
|
||||
(delete_cmd): Handle DOC_ALLOCATED flag.
|
||||
* cli/cli-decode.h (DOC_ALLOCATED): New macro for use
|
||||
in flags filed of struct cmd_list_element.
|
||||
(struct cmd_list_element): Document new flag item.
|
||||
|
||||
2012-12-04 Doug Evans <dje@google.com>
|
||||
|
||||
* symmisc.c: Whitespace fixes.
|
||||
|
|
|
@ -306,6 +306,13 @@ add_alias_cmd (char *name, char *oldname, enum command_class class,
|
|||
}
|
||||
|
||||
c = add_cmd (name, class, NULL, old->doc, list);
|
||||
|
||||
/* If OLD->DOC can be freed, we should make another copy. */
|
||||
if ((old->flags & DOC_ALLOCATED) != 0)
|
||||
{
|
||||
c->doc = xstrdup (old->doc);
|
||||
c->flags |= DOC_ALLOCATED;
|
||||
}
|
||||
/* NOTE: Both FUNC and all the FUNCTIONs need to be copied. */
|
||||
c->func = old->func;
|
||||
c->function = old->function;
|
||||
|
@ -451,6 +458,8 @@ add_setshow_cmd_full (char *name,
|
|||
}
|
||||
set = add_set_or_show_cmd (name, set_cmd, class, var_type, var,
|
||||
full_set_doc, set_list);
|
||||
set->flags |= DOC_ALLOCATED;
|
||||
|
||||
if (set_func != NULL)
|
||||
set_cmd_sfunc (set, set_func);
|
||||
|
||||
|
@ -458,6 +467,7 @@ add_setshow_cmd_full (char *name,
|
|||
|
||||
show = add_set_or_show_cmd (name, show_cmd, class, var_type, var,
|
||||
full_show_doc, show_list);
|
||||
show->flags |= DOC_ALLOCATED;
|
||||
show->show_value_func = show_func;
|
||||
|
||||
if (set_result != NULL)
|
||||
|
@ -769,6 +779,8 @@ delete_cmd (char *name, struct cmd_list_element **list,
|
|||
*prehookee = iter->hookee_pre;
|
||||
if (iter->hookee_post)
|
||||
iter->hookee_post->hook_post = 0;
|
||||
if (iter->doc && (iter->flags & DOC_ALLOCATED) != 0)
|
||||
xfree (iter->doc);
|
||||
*posthook = iter->hook_post;
|
||||
*posthookee = iter->hookee_post;
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@ cmd_types;
|
|||
#define CMD_DEPRECATED 0x1
|
||||
#define DEPRECATED_WARN_USER 0x2
|
||||
#define MALLOCED_REPLACEMENT 0x4
|
||||
#define DOC_ALLOCATED 0x8
|
||||
|
||||
struct cmd_list_element
|
||||
{
|
||||
|
@ -112,7 +113,9 @@ struct cmd_list_element
|
|||
memory for replacement is malloc'ed. When a command is
|
||||
undeprecated or re-deprecated at runtime we don't want to risk
|
||||
calling free on statically allocated memory, so we check this
|
||||
flag. */
|
||||
flag.
|
||||
|
||||
bit 3: DOC_ALLOCATED, set if the doc field should be xfree'd. */
|
||||
|
||||
int flags;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue