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)
