From 5bc81a00b656522351c5970a4e7546e9b68870a1 Mon Sep 17 00:00:00 2001 From: Pierre Muller Date: Wed, 5 Dec 2012 23:23:22 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 12 ++++++++++++ gdb/cli/cli-decode.c | 12 ++++++++++++ gdb/cli/cli-decode.h | 5 ++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 117b516..c7a8346 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2012-12-05 Pierre Muller + + 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 * symmisc.c: Whitespace fixes. diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index 3de01d5..6dd4180 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -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; diff --git a/gdb/cli/cli-decode.h b/gdb/cli/cli-decode.h index edae6e8..3d4d1b6 100644 --- a/gdb/cli/cli-decode.h +++ b/gdb/cli/cli-decode.h @@ -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; -- 2.7.4