Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Unified Diff: third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp

Issue 2825993002: Prevent integer overflows in ANPlusB handling (Closed)
Patch Set: Remove incorrect test - testing input as -1 for unsigned doesn't make sense Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp
diff --git a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp
index 92e75170fa0a97bd7b82ae5fc521192534c75cba..df48a8857ffeb417af21c52c59f72f23d4df8a2d 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp
@@ -630,7 +630,7 @@ bool CSSSelectorParser::ConsumeANPlusB(CSSParserTokenRange& range,
const CSSParserToken& token = range.Consume();
if (token.GetType() == kNumberToken &&
token.GetNumericValueType() == kIntegerValueType) {
- result = std::make_pair(0, static_cast<int>(token.NumericValue()));
+ result = std::make_pair(0, clampTo<int>(token.NumericValue()));
return true;
}
if (token.GetType() == kIdentToken) {
@@ -654,7 +654,7 @@ bool CSSSelectorParser::ConsumeANPlusB(CSSParserTokenRange& range,
n_string = range.Consume().Value().ToString();
} else if (token.GetType() == kDimensionToken &&
token.GetNumericValueType() == kIntegerValueType) {
- result.first = token.NumericValue();
+ result.first = clampTo<int>(token.NumericValue());
n_string = token.Value().ToString();
} else if (token.GetType() == kIdentToken) {
if (token.Value()[0] == '-') {
@@ -701,9 +701,14 @@ bool CSSSelectorParser::ConsumeANPlusB(CSSParserTokenRange& range,
return false;
if ((b.GetNumericSign() == kNoSign) == (sign == kNoSign))
return false;
- result.second = b.NumericValue();
- if (sign == kMinusSign)
- result.second = -result.second;
+ result.second = clampTo<int>(b.NumericValue());
+ if (sign == kMinusSign) {
+ // Negating minimum integer returns itself, instead return max integer.
+ if (UNLIKELY(result.second == std::numeric_limits<int>::min()))
+ result.second = std::numeric_limits<int>::max();
+ else
+ result.second = -result.second;
+ }
return true;
}

Powered by Google App Engine
This is Rietveld 408576698