Commit b0e72168 by Chris Mihelich Committed by Copybara-Service

Avoid signed overflow for Ed <number> _ manglings with large <number>s.

PiperOrigin-RevId: 640213246
Change-Id: Ib0dcf34d52566bfd0e3e9129c4438954aedab8ec
parent 9645a2fb
...@@ -2352,6 +2352,12 @@ static bool ParseLocalNameSuffix(State *state) { ...@@ -2352,6 +2352,12 @@ static bool ParseLocalNameSuffix(State *state) {
(IsDigit(RemainingInput(state)[0]) || RemainingInput(state)[0] == '_')) { (IsDigit(RemainingInput(state)[0]) || RemainingInput(state)[0] == '_')) {
int number = -1; int number = -1;
Optional(ParseNumber(state, &number)); Optional(ParseNumber(state, &number));
if (number < -1 || number > 2147483645) {
// Work around overflow cases. We do not expect these outside of a fuzzer
// or other source of adversarial input. If we do detect overflow here,
// we'll print {default arg#1}.
number = -1;
}
number += 2; number += 2;
// The ::{default arg#1}:: infix must be rendered before the lambda itself, // The ::{default arg#1}:: infix must be rendered before the lambda itself,
......
...@@ -391,6 +391,33 @@ TEST(Demangle, LambdaInClassMemberDefaultArgument) { ...@@ -391,6 +391,33 @@ TEST(Demangle, LambdaInClassMemberDefaultArgument) {
ASSERT_FALSE(Demangle("_ZZN1S1fEPFvvEEdn1_NKUlvE_clEv", tmp, sizeof(tmp))); ASSERT_FALSE(Demangle("_ZZN1S1fEPFvvEEdn1_NKUlvE_clEv", tmp, sizeof(tmp)));
} }
TEST(Demangle, AvoidSignedOverflowForUnfortunateParameterNumbers) {
char tmp[100];
// Here <number> + 2 fits in an int, but just barely. (We expect no such
// input in practice: real functions don't have billions of arguments.)
ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd2147483645_NKUlvE_clEv",
tmp, sizeof(tmp)));
EXPECT_STREQ(tmp,
"S::f()::{default arg#2147483647}::{lambda()#1}::operator()()");
// Now <number> is an int, but <number> + 2 is not.
ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd2147483646_NKUlvE_clEv",
tmp, sizeof(tmp)));
EXPECT_STREQ(tmp, "S::f()::{default arg#1}::{lambda()#1}::operator()()");
// <number> is the largest int.
ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd2147483647_NKUlvE_clEv",
tmp, sizeof(tmp)));
EXPECT_STREQ(tmp, "S::f()::{default arg#1}::{lambda()#1}::operator()()");
// <number> itself does not fit into an int. ParseNumber truncates the value
// to int, yielding a large negative number, which we strain out.
ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd2147483648_NKUlvE_clEv",
tmp, sizeof(tmp)));
EXPECT_STREQ(tmp, "S::f()::{default arg#1}::{lambda()#1}::operator()()");
}
TEST(Demangle, SubstpackNotationForTroublesomeTemplatePack) { TEST(Demangle, SubstpackNotationForTroublesomeTemplatePack) {
char tmp[100]; char tmp[100];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment