diff options
-rw-r--r-- | binutils/ChangeLog | 5 | ||||
-rw-r--r-- | binutils/prdbg.c | 82 |
2 files changed, 71 insertions, 16 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index d6ee055..07cfa8a 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -7,6 +7,11 @@ * ieee.c (ieee_add_bb11): Plug memory leak. (ieee_function_type): Likewise. (ieee_class_baseclass): Likewise. + * prdbg.c (pr_function_type): Close memory leaks. + (pr_method_type): Likewise. + (tg_class_static_member): Likewise. + (tg_class_method_variant): Likewise. + (tg_class_static_method_variant): Likewise. 2011-03-25 Pierre Muller <muller@ics.u-strasbg.fr> diff --git a/binutils/prdbg.c b/binutils/prdbg.c index 78a8fc7..091cefe 100644 --- a/binutils/prdbg.c +++ b/binutils/prdbg.c @@ -1,6 +1,6 @@ /* prdbg.c -- Print out generic debugging information. Copyright 1995, 1996, 1999, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2009 Free Software Foundation, Inc. + 2009, 2011 Free Software Foundation, Inc. Written by Ian Lance Taylor <ian@cygnus.com>. Tags style generation written by Salvador E. Tropea <set@computer.org>. @@ -731,10 +731,16 @@ pr_function_type (void *p, int argcount, bfd_boolean varargs) for (i = argcount - 1; i >= 0; i--) { if (! substitute_type (info, "")) - return FALSE; + { + free (arg_types); + return FALSE; + } arg_types[i] = pop_type (info); if (arg_types[i] == NULL) - return FALSE; + { + free (arg_types); + return FALSE; + } len += strlen (arg_types[i]) + 2; } if (varargs) @@ -952,10 +958,16 @@ pr_method_type (void *p, bfd_boolean domain, int argcount, bfd_boolean varargs) for (i = argcount - 1; i >= 0; i--) { if (! substitute_type (info, "")) - return FALSE; + { + free (arg_types); + return FALSE; + } arg_types[i] = pop_type (info); if (arg_types[i] == NULL) - return FALSE; + { + free (arg_types); + return FALSE; + } len += strlen (arg_types[i]) + 2; } if (varargs) @@ -2175,17 +2187,30 @@ tg_class_static_member (void *p, const char *name, sprintf (full_name, "%s::%s", info->stack->next->type, name); if (! substitute_type (info, full_name)) - return FALSE; + { + free (full_name); + return FALSE; + } if (! prepend_type (info, "static ")) - return FALSE; + { + free (full_name); + return FALSE; + } t = pop_type (info); if (t == NULL) - return FALSE; + { + free (full_name); + return FALSE; + } if (! tg_fix_visibility (info, visibility)) - return FALSE; + { + free (t); + free (full_name); + return FALSE; + } fprintf (info->f, "%s\t%s\t0;\"\tkind:x\ttype:%s\tclass:%s\taccess:%s\n", name, info->filename, t, info->stack->type, @@ -2295,12 +2320,18 @@ tg_class_method_variant (void *p, const char *physname ATTRIBUTE_UNUSED, /* Stick the name of the method into its type. */ if (! substitute_type (info, method_name)) - return FALSE; + { + free (method_name); + return FALSE; + } /* Get the type. */ method_type = pop_type (info); if (method_type == NULL) - return FALSE; + { + free (method_name); + return FALSE; + } /* Pull off the context type if there is one. */ if (! context) @@ -2309,12 +2340,21 @@ tg_class_method_variant (void *p, const char *physname ATTRIBUTE_UNUSED, { context_type = pop_type (info); if (context_type == NULL) - return FALSE; + { + free (method_type); + free (method_name); + return FALSE; + } } /* Now the top of the stack is the class. */ if (! tg_fix_visibility (info, visibility)) - return FALSE; + { + free (method_type); + free (method_name); + free (context_type); + return FALSE; + } fprintf (info->f, "%s\t%s\t0;\"\tkind:p\ttype:%s\tclass:%s\n", method_name, info->filename, method_type, info->stack->type); @@ -2360,16 +2400,26 @@ tg_class_static_method_variant (void *p, method_name = strdup (info->stack->next->method); /* Stick the name of the method into its type. */ if (! substitute_type (info, info->stack->next->method)) - return FALSE; + { + free (method_name); + return FALSE; + } /* Get the type. */ method_type = pop_type (info); if (method_type == NULL) - return FALSE; + { + free (method_name); + return FALSE; + } /* Now the top of the stack is the class. */ if (! tg_fix_visibility (info, visibility)) - return FALSE; + { + free (method_type); + free (method_name); + return FALSE; + } fprintf (info->f, "%s\t%s\t0;\"\tkind:p\ttype:%s\tclass:%s\taccess:%s\n", method_name, info->filename, method_type, info->stack->type, |