This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-configuration.git
The following commit(s) were added to refs/heads/master by this push:
new 694c5c2ce Avoid NPE when combined location strategy sub strategies is
immutable list (#639)
694c5c2ce is described below
commit 694c5c2ce092e44027795a1659a2cbdbb2d408a9
Author: Wei Huang <[email protected]>
AuthorDate: Thu May 21 14:55:52 2026 +0200
Avoid NPE when combined location strategy sub strategies is immutable list
(#639)
---
.../configuration2/io/CombinedLocationStrategy.java | 6 ++++--
.../io/TestCombinedLocationStrategy.java | 21 +++++++++++++++++++++
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git
a/src/main/java/org/apache/commons/configuration2/io/CombinedLocationStrategy.java
b/src/main/java/org/apache/commons/configuration2/io/CombinedLocationStrategy.java
index 104b4d552..872d87ec4 100644
---
a/src/main/java/org/apache/commons/configuration2/io/CombinedLocationStrategy.java
+++
b/src/main/java/org/apache/commons/configuration2/io/CombinedLocationStrategy.java
@@ -21,6 +21,7 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
@@ -119,10 +120,11 @@ public class CombinedLocationStrategy extends
AbstractFileLocationStrategy {
if (builder.subStrategies == null) {
throw new IllegalArgumentException("Collection with sub strategies
must not be null.");
}
- if (builder.subStrategies.contains(null)) {
+ List<FileLocationStrategy> subStrategiesCopy = new
ArrayList<>(builder.subStrategies);
+ if (subStrategiesCopy.contains(null)) {
throw new IllegalArgumentException("Collection with sub strategies
contains null entry.");
}
- subStrategies = Collections.unmodifiableCollection(new
ArrayList<>(builder.subStrategies));
+ subStrategies = Collections.unmodifiableCollection(subStrategiesCopy);
}
/**
diff --git
a/src/test/java/org/apache/commons/configuration2/io/TestCombinedLocationStrategy.java
b/src/test/java/org/apache/commons/configuration2/io/TestCombinedLocationStrategy.java
index f01ecb47d..f0553a4a4 100644
---
a/src/test/java/org/apache/commons/configuration2/io/TestCombinedLocationStrategy.java
+++
b/src/test/java/org/apache/commons/configuration2/io/TestCombinedLocationStrategy.java
@@ -26,9 +26,11 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.net.URL;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
+import java.util.Objects;
import org.apache.commons.configuration2.ConfigurationAssert;
import org.junit.jupiter.api.BeforeAll;
@@ -123,6 +125,25 @@ public class TestCombinedLocationStrategy {
assertThrows(IllegalArgumentException.class, () -> new
CombinedLocationStrategy(col));
}
+ /**
+ * Tests that the constructor handles collections that throw NPE on
contains(null) (like ImmutableList).
+ */
+ @Test
+ void testInitCollectionThrowsNPEOnContainsNull() {
+ // Create a collection that throws NPE on contains(null) like
List.of() instance does
+ final Collection<FileLocationStrategy> collectionThatThrowsNPE = new
ArrayList<FileLocationStrategy>(Arrays.asList(getSubStrategies())) {
+ @Override
+ public boolean contains(final Object o) {
+ Objects.requireNonNull(o);
+ return super.contains(o);
+ }
+ };
+
+ // This should not throw NPE - the constructor should handle it
gracefully
+ final CombinedLocationStrategy strategy = new
CombinedLocationStrategy(collectionThatThrowsNPE);
+ checkSubStrategies(strategy);
+ }
+
/**
* Tests whether a defensive copy of the collection with sub strategies is
made.
*/