Avoid memory leaks on struct cmd_list_element.doc field.
authorPierre Muller <muller@sourceware.org>
Wed, 5 Dec 2012 23:23:22 +0000 (23:23 +0000)
committerPierre Muller <muller@sourceware.org>
Wed, 5 Dec 2012 23:23:22 +0000 (23:23 +0000)
* 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
gdb/cli/cli-decode.c
gdb/cli/cli-decode.h

index 117b51606c270f7e4c1a76fa72184e613eaaa0a8..c7a8346ac055ffd51f1a93d587b807c8d1058e8f 100644 (file)
@@ -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.
index 3de01d58368087339783fd8cc23b7c4b7ae87835..6dd418014916ca8b99ac984fed9b7897b4465d4f 100644 (file)
@@ -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;
 
index edae6e8f2332202db777993147125bc8cd949494..3d4d1b6c0daeca81c0e4a890a942c2b3e30883b9 100644 (file)
@@ -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;