mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
* stabs.c (parse_stab_enum_type): Fix memory leaks.
(parse_stab_struct_type): Ditto. (parse_stab_struct_fields): Ditto. (parse_stab_one_struct_field): Ditto. (parse_stab_members): Ditto. (stab_demangle_qualified): Ditto.
This commit is contained in:
parent
09192bc76c
commit
1fcab1afa6
@ -12,6 +12,12 @@
|
||||
(tg_class_static_member): Likewise.
|
||||
(tg_class_method_variant): Likewise.
|
||||
(tg_class_static_method_variant): Likewise.
|
||||
* stabs.c (parse_stab_enum_type): Fix memory leaks.
|
||||
(parse_stab_struct_type): Ditto.
|
||||
(parse_stab_struct_fields): Ditto.
|
||||
(parse_stab_one_struct_field): Ditto.
|
||||
(parse_stab_members): Ditto.
|
||||
(stab_demangle_qualified): Ditto.
|
||||
|
||||
2011-03-25 Pierre Muller <muller@ics.u-strasbg.fr>
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* stabs.c -- Parse stabs debugging information
|
||||
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||
2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
|
||||
2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor <ian@cygnus.com>.
|
||||
|
||||
This file is part of GNU Binutils.
|
||||
@ -1980,6 +1980,9 @@ parse_stab_enum_type (void *dhandle, const char **pp)
|
||||
if (**pp != ',')
|
||||
{
|
||||
bad_stab (orig);
|
||||
free (name);
|
||||
free (names);
|
||||
free (values);
|
||||
return DEBUG_TYPE_NULL;
|
||||
}
|
||||
++*pp;
|
||||
@ -2021,7 +2024,7 @@ parse_stab_struct_type (void *dhandle, struct stab_handle *info,
|
||||
{
|
||||
bfd_vma size;
|
||||
debug_baseclass *baseclasses;
|
||||
debug_field *fields;
|
||||
debug_field *fields = NULL;
|
||||
bfd_boolean statics;
|
||||
debug_method *methods;
|
||||
debug_type vptrbase;
|
||||
@ -2036,7 +2039,11 @@ parse_stab_struct_type (void *dhandle, struct stab_handle *info,
|
||||
|| ! parse_stab_members (dhandle, info, tagname, pp, typenums, &methods)
|
||||
|| ! parse_stab_tilde_field (dhandle, info, pp, typenums, &vptrbase,
|
||||
&ownvptr))
|
||||
return DEBUG_TYPE_NULL;
|
||||
{
|
||||
if (fields != NULL)
|
||||
free (fields);
|
||||
return DEBUG_TYPE_NULL;
|
||||
}
|
||||
|
||||
if (! statics
|
||||
&& baseclasses == NULL
|
||||
@ -2240,7 +2247,10 @@ parse_stab_struct_fields (void *dhandle, struct stab_handle *info,
|
||||
{
|
||||
++*pp;
|
||||
if (! parse_stab_cpp_abbrev (dhandle, info, pp, fields + c))
|
||||
return FALSE;
|
||||
{
|
||||
free (fields);
|
||||
return FALSE;
|
||||
}
|
||||
++c;
|
||||
continue;
|
||||
}
|
||||
@ -2254,6 +2264,7 @@ parse_stab_struct_fields (void *dhandle, struct stab_handle *info,
|
||||
if (p == NULL)
|
||||
{
|
||||
bad_stab (orig);
|
||||
free (fields);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -2415,7 +2426,10 @@ parse_stab_one_struct_field (void *dhandle, struct stab_handle *info,
|
||||
type = parse_stab_type (dhandle, info, (const char *) NULL, pp,
|
||||
(debug_type **) NULL);
|
||||
if (type == DEBUG_TYPE_NULL)
|
||||
return FALSE;
|
||||
{
|
||||
free (name);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (**pp == ':')
|
||||
{
|
||||
@ -2427,6 +2441,7 @@ parse_stab_one_struct_field (void *dhandle, struct stab_handle *info,
|
||||
if (p == NULL)
|
||||
{
|
||||
bad_stab (orig);
|
||||
free (name);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -2444,6 +2459,7 @@ parse_stab_one_struct_field (void *dhandle, struct stab_handle *info,
|
||||
if (**pp != ',')
|
||||
{
|
||||
bad_stab (orig);
|
||||
free (name);
|
||||
return FALSE;
|
||||
}
|
||||
++*pp;
|
||||
@ -2452,6 +2468,7 @@ parse_stab_one_struct_field (void *dhandle, struct stab_handle *info,
|
||||
if (**pp != ',')
|
||||
{
|
||||
bad_stab (orig);
|
||||
free (name);
|
||||
return FALSE;
|
||||
}
|
||||
++*pp;
|
||||
@ -2460,6 +2477,7 @@ parse_stab_one_struct_field (void *dhandle, struct stab_handle *info,
|
||||
if (**pp != ';')
|
||||
{
|
||||
bad_stab (orig);
|
||||
free (name);
|
||||
return FALSE;
|
||||
}
|
||||
++*pp;
|
||||
@ -2511,6 +2529,9 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
debug_method *methods;
|
||||
unsigned int c;
|
||||
unsigned int alloc;
|
||||
char *name = NULL;
|
||||
debug_method_variant *variants = NULL;
|
||||
char *argtypes = NULL;
|
||||
|
||||
*retp = NULL;
|
||||
|
||||
@ -2523,8 +2544,6 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
while (**pp != ';')
|
||||
{
|
||||
const char *p;
|
||||
char *name;
|
||||
debug_method_variant *variants;
|
||||
unsigned int cvars;
|
||||
unsigned int allocvars;
|
||||
debug_type look_ahead_type;
|
||||
@ -2553,7 +2572,7 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
if (*p != '.')
|
||||
{
|
||||
bad_stab (orig);
|
||||
return FALSE;
|
||||
goto fail;
|
||||
}
|
||||
name = savestring (*pp, p - *pp);
|
||||
*pp = p + 1;
|
||||
@ -2570,7 +2589,6 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
{
|
||||
debug_type type;
|
||||
bfd_boolean stub;
|
||||
char *argtypes;
|
||||
enum debug_visibility visibility;
|
||||
bfd_boolean constp, volatilep, staticp;
|
||||
bfd_vma voffset;
|
||||
@ -2589,11 +2607,12 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
type = parse_stab_type (dhandle, info, (const char *) NULL, pp,
|
||||
(debug_type **) NULL);
|
||||
if (type == DEBUG_TYPE_NULL)
|
||||
return FALSE;
|
||||
goto fail;
|
||||
|
||||
if (**pp != ':')
|
||||
{
|
||||
bad_stab (orig);
|
||||
return FALSE;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2602,7 +2621,7 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
if (p == NULL)
|
||||
{
|
||||
bad_stab (orig);
|
||||
return FALSE;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
stub = FALSE;
|
||||
@ -2673,7 +2692,7 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
if (**pp != ';')
|
||||
{
|
||||
bad_stab (orig);
|
||||
return FALSE;
|
||||
goto fail;
|
||||
}
|
||||
++*pp;
|
||||
voffset &= 0x7fffffff;
|
||||
@ -2704,7 +2723,7 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
if (**pp != ';')
|
||||
{
|
||||
bad_stab (orig);
|
||||
return FALSE;
|
||||
goto fail;
|
||||
}
|
||||
++*pp;
|
||||
}
|
||||
@ -2747,18 +2766,18 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
|
||||
class_type = stab_find_type (dhandle, info, typenums);
|
||||
if (class_type == DEBUG_TYPE_NULL)
|
||||
return FALSE;
|
||||
goto fail;
|
||||
return_type = debug_get_return_type (dhandle, type);
|
||||
if (return_type == DEBUG_TYPE_NULL)
|
||||
{
|
||||
bad_stab (orig);
|
||||
return FALSE;
|
||||
goto fail;
|
||||
}
|
||||
type = parse_stab_argtypes (dhandle, info, class_type, name,
|
||||
tagname, return_type, argtypes,
|
||||
constp, volatilep, &physname);
|
||||
if (type == DEBUG_TYPE_NULL)
|
||||
return FALSE;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (cvars + 1 >= allocvars)
|
||||
@ -2782,7 +2801,7 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
constp,
|
||||
volatilep);
|
||||
if (variants[cvars] == DEBUG_METHOD_VARIANT_NULL)
|
||||
return FALSE;
|
||||
goto fail;
|
||||
|
||||
++cvars;
|
||||
}
|
||||
@ -2811,6 +2830,15 @@ parse_stab_members (void *dhandle, struct stab_handle *info,
|
||||
*retp = methods;
|
||||
|
||||
return TRUE;
|
||||
|
||||
fail:
|
||||
if (name != NULL)
|
||||
free (name);
|
||||
if (variants != NULL)
|
||||
free (variants);
|
||||
if (argtypes != NULL)
|
||||
free (argtypes);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Parse a string representing argument types for a method. Stabs
|
||||
@ -4108,7 +4136,10 @@ stab_demangle_qualified (struct stab_demangle_info *minfo, const char **pp,
|
||||
|
||||
ft = debug_get_field_type (minfo->dhandle, *fields);
|
||||
if (ft == NULL)
|
||||
return FALSE;
|
||||
{
|
||||
free (name);
|
||||
return FALSE;
|
||||
}
|
||||
dn = debug_get_type_name (minfo->dhandle, ft);
|
||||
if (dn != NULL && strcmp (dn, name) == 0)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user