https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80513

            Bug ID: 80513
           Summary: demangler walks past trailing nul in mangled name in a
                    bunch of cases
           Product: gcc
           Version: 7.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: demangler
          Assignee: unassigned at gcc dot gnu.org
          Reporter: richard-gccbugzilla at metafoo dot co.uk
  Target Milestone: ---

Example mangled name where demangler walks past two nuls:

$ echo '__thunk_16\0_\0_3foo' | c++filt 
virtual function thunk (delta:-16) for foo::~foo(void)

These are two separate bugs:

1) The gnu_special __thunk_ handling blindly assumes (without checking) that
the byte after __thunk_<num> is an underscore, and skips it:

  else if (strncmp (*mangled, "__thunk_", 8) == 0)
    {
      int delta;

      (*mangled) += 8;
      delta = consume_count (mangled);
      if (delta == -1)
        success = 0;
      else
        {
          char *method = internal_cplus_demangle (work, ++*mangled);

2) The calls to "strchr (some_chars, mangled[i]) != NULL" throughout
cplus-dem.c are all wrong, as they do not properly handle the case where
mangled[i] is 0. (In that case, strchr returns a *non-null* pointer to the nul
terminator of some_chars.)

Reply via email to