summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2017-07-13 19:37:37 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2017-07-13 19:37:37 +0000
commitb74d9d8656816110430e4ed711b88c0e6c835fae (patch)
treed0835bc5e25149b822be61a80e4ba69a3e86fb35 /src
parent28942d3ba886b4f215ac6ddaa05c55d35d927621 (diff)
[demangler] Respect try_to_parse_template_args
Fixes an exponential parse found by oss-fuzz. git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@307941 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'src')
-rw-r--r--src/cxa_demangle.cpp23
1 files changed, 13 insertions, 10 deletions
diff --git a/src/cxa_demangle.cpp b/src/cxa_demangle.cpp
index 355ba66..16aae0c 100644
--- a/src/cxa_demangle.cpp
+++ b/src/cxa_demangle.cpp
@@ -2364,17 +2364,20 @@ parse_type(const char* first, const char* last, Db& db)
first = t;
// Parsed a substitution. If the substitution is a
// <template-param> it might be followed by <template-args>.
- t = parse_template_args(first, last, db);
- if (t != first)
+ if (db.try_to_parse_template_args)
{
- if (db.names.size() < 2)
- return first;
- auto template_args = db.names.back().move_full();
- db.names.pop_back();
- db.names.back().first += template_args;
- // Need to create substitution for <template-template-param> <template-args>
- db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
- first = t;
+ t = parse_template_args(first, last, db);
+ if (t != first)
+ {
+ if (db.names.size() < 2)
+ return first;
+ auto template_args = db.names.back().move_full();
+ db.names.pop_back();
+ db.names.back().first += template_args;
+ // Need to create substitution for <template-template-param> <template-args>
+ db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
+ first = t;
+ }
}
}
}