Skip to content

Commit d80ec52

Browse files
o-mibrunin
authored andcommitted
[Backport] CVE-2025-0611: Object corruption in V8
Cherry-pick of patch originally reviewed on: https://chromium-review.googlesource.com/c/v8/v8/+/6157748: regalloc: handle non-loop resumable_loops Resumable loops which are not loops can be either: 1. An unreachable loop with only a back-edge 2. A fall-through to a resumable loop with a dead back-edge Only (1) starts with an empty register state. Fixed: 386143468 Change-Id: I67d6e042e44915ec5719fe8dfe840dbb28079d28 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6157748 Auto-Submit: Olivier Flückiger <[email protected]> Commit-Queue: Toon Verwaest <[email protected]> Commit-Queue: Olivier Flückiger <[email protected]> Reviewed-by: Toon Verwaest <[email protected]> Cr-Commit-Position: refs/heads/main@{#98016} (cherry picked from commit b44bd24761f1a2eae131bd90be15b5a68cc70f83) Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/619260 Reviewed-by: Allan Sandfeld Jensen <[email protected]> Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/624496 Reviewed-by: Anu Aliyas <[email protected]>
1 parent 842b785 commit d80ec52

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

chromium/v8/src/maglev/maglev-interpreter-frame-state.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,24 @@ void MergePointInterpreterFrameState::ReducePhiPredecessorCount(
710710
result->reduce_input_count();
711711
}
712712
}
713+
714+
bool MergePointInterpreterFrameState::IsUnreachable() const {
715+
DCHECK_EQ(predecessors_so_far_, predecessor_count_);
716+
if (predecessor_count_ > 1) {
717+
return false;
718+
}
719+
// This should actually only support predecessor_count == 1, but we
720+
// currently don't eliminate resumable loop headers (and subsequent code
721+
// until the next resume) that end up being unreachable from JumpLoop.
722+
if (predecessor_count_ == 0) {
723+
DCHECK(is_resumable_loop());
724+
return true;
725+
}
726+
DCHECK_EQ(predecessor_count_, 1);
727+
DCHECK_IMPLIES(is_loop(), predecessor_at(0)->control_node()->Is<JumpLoop>());
728+
return is_loop();
729+
}
730+
713731
} // namespace maglev
714732
} // namespace internal
715733
} // namespace v8

chromium/v8/src/maglev/maglev-interpreter-frame-state.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,8 @@ class MergePointInterpreterFrameState {
737737
predecessors_so_far_ == 0;
738738
}
739739

740+
bool IsUnreachable() const;
741+
740742
BasicBlockType basic_block_type() const {
741743
return kBasicBlockTypeBits::decode(bitfield_);
742744
}

chromium/v8/src/maglev/maglev-regalloc.cc

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ bool IsLiveAtTarget(ValueNode* node, ControlNode* source, BasicBlock* target) {
147147
}
148148

149149
// Drop all values on resumable loop headers.
150-
if (target->has_state() && target->state()->is_resumable_loop()) return false;
150+
if (target->is_loop() && target->state()->is_resumable_loop()) return false;
151151

152152
// TODO(verwaest): This should be true but isn't because we don't yet
153153
// eliminate dead code.
@@ -388,13 +388,9 @@ void StraightForwardRegisterAllocator::AllocateRegisters() {
388388
if (block->state()->is_exception_handler()) {
389389
// Exceptions start from a blank state of register values.
390390
ClearRegisterValues();
391-
} else if (block->state()->is_resumable_loop() &&
392-
block->state()->predecessor_count() <= 1) {
391+
} else if (block->state()->IsUnreachable()) {
393392
// Loops that are only reachable through JumpLoop start from a blank
394393
// state of register values.
395-
// This should actually only support predecessor_count == 1, but we
396-
// currently don't eliminate resumable loop headers (and subsequent code
397-
// until the next resume) that end up being unreachable from JumpLoop.
398394
ClearRegisterValues();
399395
} else {
400396
InitializeRegisterValues(block->state()->register_state());

0 commit comments

Comments
 (0)