Make cp_comp_to_string return a gdb::unique_xmalloc_ptr<char>
authorPedro Alves <palves@redhat.com>
Wed, 9 Aug 2017 14:04:32 +0000 (15:04 +0100)
committerPedro Alves <palves@redhat.com>
Wed, 9 Aug 2017 14:04:32 +0000 (15:04 +0100)
To help avoid issues like the one fixed by e88e8651cf34 ("Fix memory
leak in cp-support.c").

gdb/ChangeLog:
2017-08-09  Pedro Alves  <palves@redhat.com>

* cp-name-parser.y (cp_comp_to_string): Return a
gdb::unique_xmalloc_ptr<char>.
* cp-support.c (replace_typedefs_qualified_name)
(replace_typedefs): Adjust to use gdb::unique_xmalloc_ptr<char>.
(cp_canonicalize_string_full): Use op= instead of explicit
convertion.
(cp_class_name_from_physname, method_name_from_physname)
(cp_func_name, cp_remove_params): Adjust to use
gdb::unique_xmalloc_ptr<char>.
* cp-support.h (cp_comp_to_string): Return a
gdb::unique_xmalloc_ptr<char>.
* python/py-type.c (typy_lookup_type): Adjust to use
gdb::unique_xmalloc_ptr<char>.

gdb/ChangeLog
gdb/cp-name-parser.y
gdb/cp-support.c
gdb/cp-support.h
gdb/python/py-type.c

index 19d6c1bd2c826d46e3941dbaf19088a347973016..7841101d111ed17ae23b9ba9a871f6f1b0fb7166 100644 (file)
@@ -1,3 +1,19 @@
+2017-08-09  Pedro Alves  <palves@redhat.com>
+
+       * cp-name-parser.y (cp_comp_to_string): Return a
+       gdb::unique_xmalloc_ptr<char>.
+       * cp-support.c (replace_typedefs_qualified_name)
+       (replace_typedefs): Adjust to use gdb::unique_xmalloc_ptr<char>.
+       (cp_canonicalize_string_full): Use op= instead of explicit
+       convertion.
+       (cp_class_name_from_physname, method_name_from_physname)
+       (cp_func_name, cp_remove_params): Adjust to use
+       gdb::unique_xmalloc_ptr<char>.
+       * cp-support.h (cp_comp_to_string): Return a
+       gdb::unique_xmalloc_ptr<char>.
+       * python/py-type.c (typy_lookup_type): Adjust to use
+       gdb::unique_xmalloc_ptr<char>.
+
 2017-08-09  H.J. Lu  <hongjiu.lu@intel.com>
 
        * dwarf2read.c (dwarf2_string_attr): Fix a typo.
index 78745cb5c7e4a6693bbd9e7ed6bb9d76d178bfe5..d430ae762d6d9ec6f1a96d8c7c07736c5da21c46 100644 (file)
@@ -1963,13 +1963,14 @@ allocate_info (void)
    cplus_demangle_print does not, specifically the global destructor
    and constructor labels.  */
 
-char *
+gdb::unique_xmalloc_ptr<char>
 cp_comp_to_string (struct demangle_component *result, int estimated_len)
 {
   size_t err;
 
-  return cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI, result, estimated_len,
-                              &err);
+  char *res = cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI,
+                                   result, estimated_len, &err);
+  return gdb::unique_xmalloc_ptr<char> (res);
 }
 
 /* Constructor for demangle_parse_info.  */
index f6557ab310ff6712c3145928a6fdff90f8050f6c..8bcbe657a4ea74a130d22f6adcac9ff951ca5fd1 100644 (file)
@@ -296,8 +296,6 @@ replace_typedefs_qualified_name (struct demangle_parse_info *info,
                                 canonicalization_ftype *finder,
                                 void *data)
 {
-  long len;
-  char *name;
   string_file buf;
   struct demangle_component *comp = ret_comp;
 
@@ -313,14 +311,14 @@ replace_typedefs_qualified_name (struct demangle_parse_info *info,
          struct demangle_component newobj;
 
          buf.write (d_left (comp)->u.s_name.s, d_left (comp)->u.s_name.len);
-         len = buf.size ();
-         name = (char *) obstack_copy0 (&info->obstack, buf.c_str (), len);
          newobj.type = DEMANGLE_COMPONENT_NAME;
-         newobj.u.s_name.s = name;
-         newobj.u.s_name.len = len;
+         newobj.u.s_name.s
+           = (char *) obstack_copy0 (&info->obstack,
+                                     buf.c_str (), buf.size ());
+         newobj.u.s_name.len = buf.size ();
          if (inspect_type (info, &newobj, finder, data))
            {
-             char *n, *s;
+             char *s;
              long slen;
 
              /* A typedef was substituted in NEW.  Convert it to a
@@ -328,15 +326,15 @@ replace_typedefs_qualified_name (struct demangle_parse_info *info,
                 node.  */
 
              buf.clear ();
-             n = cp_comp_to_string (&newobj, 100);
+             gdb::unique_xmalloc_ptr<char> n
+               = cp_comp_to_string (&newobj, 100);
              if (n == NULL)
                {
                  /* If something went astray, abort typedef substitutions.  */
                  return;
                }
 
-             s = copy_string_to_obstack (&info->obstack, n, &slen);
-             xfree (n);
+             s = copy_string_to_obstack (&info->obstack, n.get (), &slen);
 
              d_left (ret_comp)->type = DEMANGLE_COMPONENT_NAME;
              d_left (ret_comp)->u.s_name.s = s;
@@ -352,14 +350,14 @@ replace_typedefs_qualified_name (struct demangle_parse_info *info,
             typedefs in it.  Then print it to the stream to continue
             checking for more typedefs in the tree.  */
          replace_typedefs (info, d_left (comp), finder, data);
-         name = cp_comp_to_string (d_left (comp), 100);
+         gdb::unique_xmalloc_ptr<char> name
+           = cp_comp_to_string (d_left (comp), 100);
          if (name == NULL)
            {
              /* If something went astray, abort typedef substitutions.  */
              return;
            }
-         buf.puts (name);
-         xfree (name);
+         buf.puts (name.get ());
        }
 
       buf.write ("::", 2);
@@ -373,15 +371,15 @@ replace_typedefs_qualified_name (struct demangle_parse_info *info,
   if (comp->type == DEMANGLE_COMPONENT_NAME)
     {
       buf.write (comp->u.s_name.s, comp->u.s_name.len);
-      len = buf.size ();
-      name = (char *) obstack_copy0 (&info->obstack, buf.c_str (), len);
 
       /* Replace the top (DEMANGLE_COMPONENT_QUAL_NAME) node
         with a DEMANGLE_COMPONENT_NAME node containing the whole
         name.  */
       ret_comp->type = DEMANGLE_COMPONENT_NAME;
-      ret_comp->u.s_name.s = name;
-      ret_comp->u.s_name.len = len;
+      ret_comp->u.s_name.s
+       = (char *) obstack_copy0 (&info->obstack,
+                                 buf.c_str (), buf.size ());
+      ret_comp->u.s_name.len = buf.size ();
       inspect_type (info, ret_comp, finder, data);
     }
   else
@@ -423,7 +421,8 @@ replace_typedefs (struct demangle_parse_info *info,
              || ret_comp->type == DEMANGLE_COMPONENT_TEMPLATE
              || ret_comp->type == DEMANGLE_COMPONENT_BUILTIN_TYPE))
        {
-         char *local_name = cp_comp_to_string (ret_comp, 10);
+         gdb::unique_xmalloc_ptr<char> local_name
+           = cp_comp_to_string (ret_comp, 10);
 
          if (local_name != NULL)
            {
@@ -432,15 +431,14 @@ replace_typedefs (struct demangle_parse_info *info,
              sym = NULL;
              TRY
                {
-                 sym = lookup_symbol (local_name, 0, VAR_DOMAIN, 0).symbol;
+                 sym = lookup_symbol (local_name.get (), 0,
+                                      VAR_DOMAIN, 0).symbol;
                }
              CATCH (except, RETURN_MASK_ALL)
                {
                }
              END_CATCH
 
-             xfree (local_name);
-
              if (sym != NULL)
                {
                  struct type *otype = SYMBOL_TYPE (sym);
@@ -527,8 +525,8 @@ cp_canonicalize_string_full (const char *string,
       replace_typedefs (info.get (), info->tree, finder, data);
 
       /* Convert the tree back into a string.  */
-      gdb::unique_xmalloc_ptr<char> us (cp_comp_to_string (info->tree,
-                                                          estimated_len));
+      gdb::unique_xmalloc_ptr<char> us cp_comp_to_string (info->tree,
+                                                           estimated_len);
       gdb_assert (us);
 
       ret = us.get ();
@@ -642,7 +640,8 @@ char *
 cp_class_name_from_physname (const char *physname)
 {
   void *storage = NULL;
-  char *demangled_name = NULL, *ret;
+  char *demangled_name = NULL;
+  gdb::unique_xmalloc_ptr<char> ret;
   struct demangle_component *ret_comp, *prev_comp, *cur_comp;
   std::unique_ptr<demangle_parse_info> info;
   int done;
@@ -711,7 +710,6 @@ cp_class_name_from_physname (const char *physname)
        break;
       }
 
-  ret = NULL;
   if (cur_comp != NULL && prev_comp != NULL)
     {
       /* We want to discard the rightmost child of PREV_COMP.  */
@@ -723,7 +721,7 @@ cp_class_name_from_physname (const char *physname)
 
   xfree (storage);
   xfree (demangled_name);
-  return ret;
+  return ret.release ();
 }
 
 /* Return the child of COMP which is the basename of a method,
@@ -790,7 +788,8 @@ char *
 method_name_from_physname (const char *physname)
 {
   void *storage = NULL;
-  char *demangled_name = NULL, *ret;
+  char *demangled_name = NULL;
+  gdb::unique_xmalloc_ptr<char> ret;
   struct demangle_component *ret_comp;
   std::unique_ptr<demangle_parse_info> info;
 
@@ -801,7 +800,6 @@ method_name_from_physname (const char *physname)
 
   ret_comp = unqualified_name_from_comp (info->tree);
 
-  ret = NULL;
   if (ret_comp != NULL)
     /* The ten is completely arbitrary; we don't have a good
        estimate.  */
@@ -809,7 +807,7 @@ method_name_from_physname (const char *physname)
 
   xfree (storage);
   xfree (demangled_name);
-  return ret;
+  return ret.release ();
 }
 
 /* If FULL_NAME is the demangled name of a C++ function (including an
@@ -821,7 +819,7 @@ method_name_from_physname (const char *physname)
 char *
 cp_func_name (const char *full_name)
 {
-  char *ret;
+  gdb::unique_xmalloc_ptr<char> ret;
   struct demangle_component *ret_comp;
   std::unique_ptr<demangle_parse_info> info;
 
@@ -831,11 +829,10 @@ cp_func_name (const char *full_name)
 
   ret_comp = unqualified_name_from_comp (info->tree);
 
-  ret = NULL;
   if (ret_comp != NULL)
     ret = cp_comp_to_string (ret_comp, 10);
 
-  return ret;
+  return ret.release ();
 }
 
 /* DEMANGLED_NAME is the name of a function, including parameters and
@@ -848,7 +845,7 @@ cp_remove_params (const char *demangled_name)
   int done = 0;
   struct demangle_component *ret_comp;
   std::unique_ptr<demangle_parse_info> info;
-  char *ret = NULL;
+  gdb::unique_xmalloc_ptr<char> ret;
 
   if (demangled_name == NULL)
     return NULL;
@@ -880,7 +877,7 @@ cp_remove_params (const char *demangled_name)
   if (ret_comp->type == DEMANGLE_COMPONENT_TYPED_NAME)
     ret = cp_comp_to_string (d_left (ret_comp), 10);
 
-  return ret;
+  return ret.release ();
 }
 
 /* Here are some random pieces of trivia to keep in mind while trying
index 37b281fa54af555a9b34acc04803a33800e96473..9210165cd1419f7d0db3b8bdeb07bdd826a6d324 100644 (file)
@@ -150,8 +150,8 @@ struct type *cp_find_type_baseclass_by_name (struct type *parent_type,
 extern std::unique_ptr<demangle_parse_info> cp_demangled_name_to_comp
      (const char *demangled_name, const char **errmsg);
 
-extern char *cp_comp_to_string (struct demangle_component *result,
-                               int estimated_len);
+extern gdb::unique_xmalloc_ptr<char> cp_comp_to_string
+  (struct demangle_component *result, int estimated_len);
 
 extern void cp_merge_demangle_parse_infos (struct demangle_parse_info *,
                                           struct demangle_component *,
index aa20d4ca82a761faf4ea919c7fe2ad8fa3c833a6..51184ca5ed63069a81cd30eeb9d1491509b2f51e 100644 (file)
@@ -761,7 +761,6 @@ typy_lookup_type (struct demangle_component *demangled,
                  const struct block *block)
 {
   struct type *type, *rtype = NULL;
-  char *type_name = NULL;
   enum demangle_component_type demangled_type;
 
   /* Save the type: typy_lookup_type() may (indirectly) overwrite
@@ -816,11 +815,8 @@ typy_lookup_type (struct demangle_component *demangled,
     return rtype;
 
   /* We don't have a type, so lookup the type.  */
-  type_name = cp_comp_to_string (demangled, 10);
-  type = typy_lookup_typename (type_name, block);
-  xfree (type_name);
-
-  return type;
+  gdb::unique_xmalloc_ptr<char> type_name = cp_comp_to_string (demangled, 10);
+  return typy_lookup_typename (type_name.get (), block);
 }
 
 /* This is a helper function for typy_template_argument that is used