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.
This commit is contained in:
parent
67bb16f345
commit
af03af8f55
21 changed files with 603 additions and 145 deletions
|
@ -120,6 +120,8 @@ static size_t prefix_length;
|
|||
static bfd_boolean unwind_inlines; /* --inlines. */
|
||||
static const char * disasm_sym; /* Disassembly start symbol. */
|
||||
|
||||
static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
|
||||
|
||||
/* A structure to record the sections mentioned in -j switches. */
|
||||
struct only
|
||||
{
|
||||
|
@ -252,6 +254,8 @@ usage (FILE *stream, int status)
|
|||
The STYLE, if specified, can be `auto', `gnu',\n\
|
||||
`lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
|
||||
or `gnat'\n\
|
||||
--recurse-limit Enable a limit on recursion whilst demangling. [Default]\n\
|
||||
--no-recurse-limit Disable a limit on recursion whilst demangling\n\
|
||||
-w, --wide Format output for more than 80 columns\n\
|
||||
-z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
|
||||
--start-address=ADDR Only process data whose address is >= ADDR\n\
|
||||
|
@ -302,6 +306,8 @@ enum option_values
|
|||
OPTION_DWARF_DEPTH,
|
||||
OPTION_DWARF_CHECK,
|
||||
OPTION_DWARF_START,
|
||||
OPTION_RECURSE_LIMIT,
|
||||
OPTION_NO_RECURSE_LIMIT,
|
||||
OPTION_INLINES
|
||||
};
|
||||
|
||||
|
@ -333,6 +339,10 @@ static struct option long_options[]=
|
|||
{"line-numbers", no_argument, NULL, 'l'},
|
||||
{"no-show-raw-insn", no_argument, &show_raw_insn, -1},
|
||||
{"prefix-addresses", no_argument, &prefix_addresses, 1},
|
||||
{"recurse-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
|
||||
{"recursion-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
|
||||
{"no-recurse-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
|
||||
{"no-recursion-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
|
||||
{"reloc", no_argument, NULL, 'r'},
|
||||
{"section", required_argument, NULL, 'j'},
|
||||
{"section-headers", no_argument, NULL, 'h'},
|
||||
|
@ -884,7 +894,7 @@ objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
|
|||
if (do_demangle && name[0] != '\0')
|
||||
{
|
||||
/* Demangle the name. */
|
||||
alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
|
||||
alloc = bfd_demangle (abfd, name, demangle_flags);
|
||||
if (alloc != NULL)
|
||||
name = alloc;
|
||||
}
|
||||
|
@ -2290,7 +2300,7 @@ disassemble_section (bfd *abfd, asection *section, void *inf)
|
|||
if (do_demangle && name[0] != '\0')
|
||||
{
|
||||
/* Demangle the name. */
|
||||
alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
|
||||
alloc = bfd_demangle (abfd, name, demangle_flags);
|
||||
if (alloc != NULL)
|
||||
name = alloc;
|
||||
}
|
||||
|
@ -3268,7 +3278,7 @@ dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
|
|||
/* If we want to demangle the name, we demangle it
|
||||
here, and temporarily clobber it while calling
|
||||
bfd_print_symbol. FIXME: This is a gross hack. */
|
||||
alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
|
||||
alloc = bfd_demangle (cur_bfd, name, demangle_flags);
|
||||
if (alloc != NULL)
|
||||
(*current)->name = alloc;
|
||||
bfd_print_symbol (cur_bfd, stdout, *current,
|
||||
|
@ -3927,6 +3937,12 @@ main (int argc, char **argv)
|
|||
cplus_demangle_set_style (style);
|
||||
}
|
||||
break;
|
||||
case OPTION_RECURSE_LIMIT:
|
||||
demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
|
||||
break;
|
||||
case OPTION_NO_RECURSE_LIMIT:
|
||||
demangle_flags |= DMGL_NO_RECURSE_LIMIT;
|
||||
break;
|
||||
case 'w':
|
||||
do_wide = wide_output = TRUE;
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue