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.
      */

Reply via email to