From d9858fbd322ce20de84f44ce67ae11edf081578c Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 24 Feb 2026 00:47:35 +0900 Subject: fix(solver): iterate live watch chain to prevent infinite loop in propagation The watch graph's propagateLiteral used a cloned chain for iteration while checking the live chain for bounds. After move_watch removed a node, the stale clone kept re-reading the same node index, causing an infinite loop on large dependency sets (e.g. laravel/laravel). Now re-fetch the live chain each iteration, matching Composer's SplDoublyLinkedList semantics where remove() advances the iterator. Co-Authored-By: Claude Opus 4.6 --- crates/mozart-sat-resolver/src/solver.rs | 1 - 1 file changed, 1 deletion(-) (limited to 'crates/mozart-sat-resolver/src/solver.rs') diff --git a/crates/mozart-sat-resolver/src/solver.rs b/crates/mozart-sat-resolver/src/solver.rs index e52c913..7ade361 100644 --- a/crates/mozart-sat-resolver/src/solver.rs +++ b/crates/mozart-sat-resolver/src/solver.rs @@ -785,7 +785,6 @@ impl<'a> Solver<'a> { if let Some(literal) = last_literal { let last_l = last_level.unwrap(); - self.branches[last_branch_index] .0 .remove(last_branch_offset); -- cgit v1.3.1