Commit a305d2de authored by Jakob Gruber's avatar Jakob Gruber Committed by Commit Bot

[regexp] Fix integer overflows in TextNode::GetQuickCheckDetails

Several uc32 (= int32_t) fields were incorrectly treated as uc16
(= uint16_t):

CharacterRange::from()
CharacterRange::to()
QuickCheckDetails::Position::mask
QuickCheckDetails::Position::value

Bug: v8:10568
Change-Id: I9ea7d76e4a0cbc6ee681de2136c398cdc622bca2
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2230527
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68290}
parent abe6ce3d
...@@ -76,9 +76,8 @@ class Interval { ...@@ -76,9 +76,8 @@ class Interval {
int to_; int to_;
}; };
// Represents code points (with values up to 0x10FFFF) in the range from from_
// Represents code units in the range from from_ to to_, both ends are // to to_, both ends are inclusive.
// inclusive.
class CharacterRange { class CharacterRange {
public: public:
CharacterRange() : from_(0), to_(0) {} CharacterRange() : from_(0), to_(0) {}
......
This diff is collapsed.
...@@ -96,8 +96,8 @@ class QuickCheckDetails { ...@@ -96,8 +96,8 @@ class QuickCheckDetails {
void set_cannot_match() { cannot_match_ = true; } void set_cannot_match() { cannot_match_ = true; }
struct Position { struct Position {
Position() : mask(0), value(0), determines_perfectly(false) {} Position() : mask(0), value(0), determines_perfectly(false) {}
uc16 mask; uc32 mask;
uc16 value; uc32 value;
bool determines_perfectly; bool determines_perfectly;
}; };
int characters() { return characters_; } int characters() { return characters_; }
......
...@@ -143,7 +143,7 @@ void DotPrinterImpl::VisitText(TextNode* that) { ...@@ -143,7 +143,7 @@ void DotPrinterImpl::VisitText(TextNode* that) {
if (node->is_negated()) os_ << "^"; if (node->is_negated()) os_ << "^";
for (int j = 0; j < node->ranges(zone)->length(); j++) { for (int j = 0; j < node->ranges(zone)->length(); j++) {
CharacterRange range = node->ranges(zone)->at(j); CharacterRange range = node->ranges(zone)->at(j);
os_ << AsUC16(range.from()) << "-" << AsUC16(range.to()); os_ << AsUC32(range.from()) << "-" << AsUC32(range.to());
} }
os_ << "]"; os_ << "]";
break; break;
......
// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
assertEquals(/[--𐀾]/u.exec("Hr3QoS3KCWXQ2yjBoDIK")[0], "H");
assertEquals(/[0-\u{10000}]/u.exec("A0")[0], "A");
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