diff options
author | Nick Clifton <nickc@redhat.com> | 2018-12-07 11:32:55 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2018-12-07 11:32:55 +0000 |
commit | af03af8f55f2536b6e20928e6b1fa0324a5f3d6e (patch) | |
tree | fa6b5ef700e811c0d6bfaec08d2ebb8291dae17f /binutils/stabs.c | |
parent | 67bb16f345cb72740ab523018709c183ff3f8c8d (diff) | |
download | gdb-af03af8f55f2536b6e20928e6b1fa0324a5f3d6e.zip gdb-af03af8f55f2536b6e20928e6b1fa0324a5f3d6e.tar.gz gdb-af03af8f55f2536b6e20928e6b1fa0324a5f3d6e.tar.bz2 |
Synchronize libiberty with gcc and add --no-recruse-limit option to tools that support name demangling.
This patch addresses the multitude of bug reports about resource exhaustion
in libiberty's name demangling code. It adds a limit to the amount of
recursion that is allowed, before an error is triggered. It also adds a
new demangling option to disable this limit. (The limit is enabled by
default).
PR 87681
PR 87675
PR 87636
PR 87335
libiberty * cp-demangle.h (struct d_info): Add recursion_limit field.
* cp-demangle.c (d_function_type): If the recursion limit is
enabled and reached, return with a failure result.
(d_demangle_callback): If the recursion limit is enabled, check
for a mangled string that is so long that there is not enough
stack space for the local arrays.
* cplus-dem.c (struct work): Add recursion_level field.
(demangle_nested_args): If the recursion limit is enabled and
reached, return with a failure result.
include * demangle.h (DMGL_RECURSE_LIMIT): Define.
(DEMANGLE_RECURSION_LIMIT): Prototype.
binutuils * addr2line.c (demangle_flags): New static variable.
(long_options): Add --recurse-limit and --no-recurse-limit.
(translate_address): Pass demangle_flags to bfd_demangle.
(main): Handle --recurse-limit and --no-recurse-limit options.
* cxxfilt.c (flags): Add DMGL_RECURSE_LIMIT.
(long_options): Add --recurse-limit and --no-recurse-limit.
(main): Handle new options.
* dlltool.c (gen_def_file): Include DMGL_RECURSE_LIMIT in flags
passed to cplus_demangle.
* nm.c (demangle_flags): New static variable.
(long_options): Add --recurse-limit and --no-recurse-limit.
(main): Handle new options.
* objdump.c (demangle_flags): New static variable.
(usage): Add --recurse-limit and --no-recurse-limit.
(long_options): Likewise.
(objdump_print_symname): Pass demangle_flags to bfd_demangle.
(disassemble_section): Likewise.
(dump_dymbols): Likewise.
(main): Handle new options.
* prdbg.c (demangle_flags): New static variable.
(tg_variable): Pass demangle_flags to demangler.
(tg_start_function): Likewise.
* stabs.c (demangle_flags): New static variable.
(stab_demangle_template): Pass demangle_flags to demangler.
(stab_demangle_v3_argtypes): Likewise.
(stab_demangle_v3_arg): Likewise.
* doc/binutuls.texi: Document new command line options.
* NEWS: Mention the new feature.
* testsuite/config/default.exp (CXXFILT): Define if not already
defined.
(CXXFILTFLAGS): Likewise.
* testsuite/binutils-all/cxxfilt.exp: New file. Runs a few
simple tests of the cxxfilt program.
Diffstat (limited to 'binutils/stabs.c')
-rw-r--r-- | binutils/stabs.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/binutils/stabs.c b/binutils/stabs.c index bf53607..fc459c4 100644 --- a/binutils/stabs.c +++ b/binutils/stabs.c @@ -215,6 +215,8 @@ static debug_type stab_demangle_v3_arg (void *, struct stab_handle *, struct demangle_component *, debug_type, bfd_boolean *); +static int demangle_flags = DMGL_ANSI; + /* Save a string in memory. */ static char * @@ -4517,7 +4519,7 @@ stab_demangle_template (struct stab_demangle_info *minfo, const char **pp, free (s1); - s3 = cplus_demangle (s2, DMGL_ANSI); + s3 = cplus_demangle (s2, demangle_flags); free (s2); @@ -5243,7 +5245,7 @@ stab_demangle_v3_argtypes (void *dhandle, struct stab_handle *info, void *mem; debug_type *pargs; - dc = cplus_demangle_v3_components (physname, DMGL_PARAMS | DMGL_ANSI, &mem); + dc = cplus_demangle_v3_components (physname, DMGL_PARAMS | demangle_flags, &mem); if (dc == NULL) { stab_bad_demangle (physname); @@ -5418,7 +5420,7 @@ stab_demangle_v3_arg (void *dhandle, struct stab_handle *info, /* We print this component to get a class name which we can use. FIXME: This probably won't work if the template uses template parameters which refer to an outer template. */ - p = cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI, dc, 20, &alc); + p = cplus_demangle_print (DMGL_PARAMS | demangle_flags, dc, 20, &alc); if (p == NULL) { fprintf (stderr, _("Failed to print demangled template\n")); @@ -5498,7 +5500,7 @@ stab_demangle_v3_arg (void *dhandle, struct stab_handle *info, /* We print this component in order to find out the type name. FIXME: Should we instead expose the demangle_builtin_type_info structure? */ - p = cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI, dc, 20, &alc); + p = cplus_demangle_print (DMGL_PARAMS | demangle_flags, dc, 20, &alc); if (p == NULL) { fprintf (stderr, _("Couldn't get demangled builtin type\n")); |