This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch chore/jdbc-package-cleanup
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 9bfed5f495483bea64a2cd5068c48c4827a97e51
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Sat Aug 15 13:20:00 2026 -0500

    Fix potential NPE in DataSourceConnectionSource.close() when unwrapping a 
DelegatingDataSource
    
    DelegatingDataSource.getTargetDataSource() can return null when no target
    has been set, which previously caused an immediate NullPointerException on
    the following source.getClass() call. Break out of the unwrap loop instead
    and add a regression test covering the scenario.
    
    Co-Authored-By: Claude Sonnet 5 <[email protected]>
---
 .../gorm/jdbc/connections/DataSourceConnectionSource.java    |  3 +++
 .../jdbc/connections/DataSourceConnectionSourceSpec.groovy   | 12 ++++++++++++
 2 files changed, 15 insertions(+)

diff --git 
a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSource.java
 
b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSource.java
index 026edda904..fa4b435ddb 100644
--- 
a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSource.java
+++ 
b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSource.java
@@ -55,6 +55,9 @@ public class DataSourceConnectionSource extends 
DefaultConnectionSource<DataSour
 
             while (closeMethod == null && source instanceof 
DelegatingDataSource) {
                 source = ((DelegatingDataSource) source).getTargetDataSource();
+                if (source == null) {
+                    break;
+                }
                 closeMethod = ReflectionUtils.findMethod(source.getClass(), 
"close");
             }
 
diff --git 
a/grails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSourceSpec.groovy
 
b/grails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSourceSpec.groovy
index 9b1c127ef3..f923d3f63c 100644
--- 
a/grails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSourceSpec.groovy
+++ 
b/grails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSourceSpec.groovy
@@ -54,6 +54,18 @@ class DataSourceConnectionSourceSpec extends Specification {
         1 * closeable.close()
     }
 
+    void "close does not fail when a DelegatingDataSource has no target set"() 
{
+        given:
+        def delegating = new DelegatingDataSource()
+        def source = new DataSourceConnectionSource('test', delegating, new 
DataSourceSettings())
+
+        when:
+        source.close()
+
+        then:
+        noExceptionThrown()
+    }
+
     void "close does not fail when the DataSource has no close() method"() {
         given:
         def dataSource = Mock(DataSource)

Reply via email to