From 14423ca42f1d1beff826bb3581996de04f9e0021 Mon Sep 17 00:00:00 2001 From: Anthony Yakovlev Date: Wed, 11 Mar 2026 20:30:52 +0300 Subject: [PATCH] Fix ISXB-1792: HaveDuplicateReferences inner loop bound (n < count not n < count - i) - Inner loop was terminating too early, missing duplicate checks for later elements. - Add Utilities_HaveDuplicateReferences_DetectsDuplicatesInFullRange test including regression for dup at end. Made-with: Cursor --- .../InputSystem/Utilities/ArrayHelperTests.cs | 17 +++++++++++++++++ .../InputSystem/Utilities/ArrayHelpers.cs | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Assets/Tests/InputSystem/Utilities/ArrayHelperTests.cs b/Assets/Tests/InputSystem/Utilities/ArrayHelperTests.cs index e2096638f7..d1dc7cd557 100644 --- a/Assets/Tests/InputSystem/Utilities/ArrayHelperTests.cs +++ b/Assets/Tests/InputSystem/Utilities/ArrayHelperTests.cs @@ -118,6 +118,23 @@ public void Utilities_IndexOfReference__IsUsingReferenceEqualsAndConstrainedBySt Assert.AreEqual(2, arr.IndexOfReference(arr[2], 1, 3)); } + [Test] + [Category("Utilities")] + public void Utilities_HaveDuplicateReferences_DetectsDuplicatesInFullRange() + { + var withDup = new object[] { new object(), new object(), new object() }; + withDup[2] = withDup[0]; // duplicate at 0 and 2 + Assert.That(withDup.HaveDuplicateReferences(0, 3), Is.True); + + var noDup = new object[] { new object(), new object(), new object() }; + Assert.That(noDup.HaveDuplicateReferences(0, 3), Is.False); + + // Regression test for ISXB-1792: inner loop was "n < count - i" so later pairs were never checked + var dupAtEnd = new object[] { new object(), new object(), new object(), new object() }; + dupAtEnd[3] = dupAtEnd[2]; // duplicate at 2 and 3 + Assert.That(dupAtEnd.HaveDuplicateReferences(0, 4), Is.True); + } + [Test] [Category("Utilities")] public void Utilities_IndexOfPredicate__IsUsingPredicateForEqualityAndConstraintedByStartIndexAndCount() diff --git a/Packages/com.unity.inputsystem/InputSystem/Utilities/ArrayHelpers.cs b/Packages/com.unity.inputsystem/InputSystem/Utilities/ArrayHelpers.cs index 54a4972495..81308623e5 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Utilities/ArrayHelpers.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Utilities/ArrayHelpers.cs @@ -120,7 +120,7 @@ public static bool HaveDuplicateReferences(this TFirst[] first, int inde for (var i = 0; i < count; ++i) { var element = first[i]; - for (var n = i + 1; n < count - i; ++n) + for (var n = i + 1; n < count; ++n) { if (ReferenceEquals(element, first[n])) return true;