On Fri, 2018-06-22 at 15:44 -0600, Jeff Law wrote:
> On 03/03/2018 05:48 AM, David Malcolm wrote:
> > PR demangler/84668 reports this failure of c++filt (found by
> > fuzzing):
> >
> > $ c++filt '______H5z5555555555_____H5z55555555555555555555555'
> > c++filt: out of memory allocating 18446744071696285694 bytes after
> > a total of 135168 bytes
> >
> > internal_cplus_demangle handles the "H5" as a template with 5
> > arguments;
> > the "z5555555555" is handled as a template parameter length of
> > 5555555555, though this is truncated to 32-bits to 1260588259:
> >
> > (gdb) p /x 5555555555
> > $19 = 0x14b230ce3
> >
> > (gdb) p /x r
> > $18 = 0x4b230ce3
> >
> > (gdb) p r
> > $17 = 1260588259
> >
> > demangle_template_template_parm repeatedly calls do_type for each
> > of
> > these 1.2 billion template params, and each call attempts to handle
> > the
> > "_", but hits this within demangle_fund_type:
> >
> > 3996 /* Now pick off the fundamental type. There can be
> > only one. */
> > 3997
> > 3998 switch (**mangled)
> > 3999 {
> > 4000 case '\0':
> > 4001 case '_':
> > 4002 break;
> >
> > and thus returns true for success. It does this without consuming
> > any
> > of the input string.
> >
> > At each iteration, it appends ", ", leading to the construction of
> > a string of the form:
> >
> > "____<template <, , , , , , , , , , , , , , , , , , , , , , , , ,
> > "
> >
> > and eventually the allocation fails.
> >
> > It seems like a bug for demangle_template_template_parm to be able
> > to
> > arbitrarily grow like this without consuming the input string (or
> > failing).
> >
> > This patch fixes the issue by making the NIL / '_' cases quoted
> > above be
> > a failure, thus ending the iteration. I'm not sure if this is the
> > correct behavior (I'm new to this code), but none of the existing
> > testcases
> > are affected.
> >
> > Successfully bootstrapped®rtested on x86_64-pc-linux-gnu.
> >
> > OK for trunk?
> >
> > libiberty/ChangeLog:
> > PR demangler/84668
> > * cplus-dem.c (demangle_fund_type) <'\0', '_'>: Fail.
> > * testsuite/demangle-expected: Add test.
>
> I kept hoping someone else would chime in here :(
>
> You should probably ping Jason directly. He's more likely to know if
> we
> can blindly return a failure at this point.
>
> Jeff
Thanks.
Jason, any thoughts?
Link to original patch:
https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00179.html