Skip to content

Infinite loop in demangler #50749

@borman

Description

@borman
Bugzilla Link 51407
Resolution FIXED
Resolved on Aug 17, 2021 15:18
Version trunk
OS All
CC @ldionne
Fixed by commit(s) f0fcd42

Extended Description

A libfuzzer run has discovered some inputs for which the demangler does not terminate.

When minimized, it looks like this: _Zcv1BIRT_EIS1_E

Deciphered:
_Z
cv - conversion operator

  * result type

1B - "B"
I - template args begin
R - reference type <.
T_ - forward template reference | *
E - template args end | |
| |
* parameter type | |
I - template args begin | |
S1_ - substitution #​1 * <'
E - template args end

The reason is: template-parameter refs in conversion operator result type create forward-references, while substitutions are instantly resolved via back-references. Together these can create a reference loop. It causes an infinite loop in ReferenceType::collapse().

I see three possible ways to avoid these loops:

  1. check if resolving a forward reference creates a loop and reject the invalid input (hard to traverse AST at this point)
  2. check if a substitution contains a malicious forward reference and reject the invalid input (hard to traverse AST at this point; substitutions are quite common: may affect performance; hard to clearly detect loops at this point)
  3. detect loops in ReferenceType::collapse() (cannot reject the input)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzilla

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions