This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-dbcp.git
commit a26c248749b5d1a7e606671203077cd7630fd657 Author: Gary Gregory <gardgreg...@gmail.com> AuthorDate: Tue Jul 30 15:10:14 2019 -0400 [DBCP-549] Make org.apache.commons.dbcp2.AbandonedTrace.removeTrace(AbandonedTrace) null-safe. --- src/changes/changes.xml | 3 +++ src/main/java/org/apache/commons/dbcp2/AbandonedTrace.java | 14 +++++++++++++- .../java/org/apache/commons/dbcp2/DelegatingResultSet.java | 4 ++-- .../apache/commons/dbcp2/PoolableCallableStatement.java | 8 ++------ .../apache/commons/dbcp2/PoolablePreparedStatement.java | 8 ++------ 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index df7d6f9..3325853 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -112,6 +112,9 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="update" issue="DBCP-548" due-to="Gary Gregory"> Update Apache Commons Pool from 2.6.1 to 2.7.0. </action> + <action dev="ggregory" type="update" issue="DBCP-549" due-to="Gary Gregory"> + Make org.apache.commons.dbcp2.AbandonedTrace.removeTrace(AbandonedTrace) null-safe. + </action> </release> <release version="2.6.0" date="2019-02-14" description="This is a minor release, including bug fixes and enhancements."> <action dev="chtompki" type="add" issue="DBCP-534" due-to="Peter Wicks"> diff --git a/src/main/java/org/apache/commons/dbcp2/AbandonedTrace.java b/src/main/java/org/apache/commons/dbcp2/AbandonedTrace.java index 659fe76..aa55882 100644 --- a/src/main/java/org/apache/commons/dbcp2/AbandonedTrace.java +++ b/src/main/java/org/apache/commons/dbcp2/AbandonedTrace.java @@ -155,7 +155,7 @@ public class AbandonedTrace implements TrackedUse { final Iterator<WeakReference<AbandonedTrace>> iter = traceList.iterator(); while (iter.hasNext()) { final AbandonedTrace traceInList = iter.next().get(); - if (trace.equals(traceInList)) { + if (trace != null && trace.equals(traceInList)) { iter.remove(); break; } else if (traceInList == null) { @@ -165,4 +165,16 @@ public class AbandonedTrace implements TrackedUse { } } } + + /** + * Removes this object the source object is tracing. + * + * @param source The object tracing + * @since 2.7.0 + */ + protected void removeThisTrace(final Object source) { + if (source instanceof AbandonedTrace) { + AbandonedTrace.class.cast(source).removeTrace(this); + } + } } diff --git a/src/main/java/org/apache/commons/dbcp2/DelegatingResultSet.java b/src/main/java/org/apache/commons/dbcp2/DelegatingResultSet.java index 3d1483c..86e4d43 100644 --- a/src/main/java/org/apache/commons/dbcp2/DelegatingResultSet.java +++ b/src/main/java/org/apache/commons/dbcp2/DelegatingResultSet.java @@ -186,11 +186,11 @@ public final class DelegatingResultSet extends AbandonedTrace implements ResultS public void close() throws SQLException { try { if (statement != null) { - ((AbandonedTrace) statement).removeTrace(this); + removeThisTrace(statement); statement = null; } if (connection != null) { - ((AbandonedTrace) connection).removeTrace(this); + removeThisTrace(connection); connection = null; } resultSet.close(); diff --git a/src/main/java/org/apache/commons/dbcp2/PoolableCallableStatement.java b/src/main/java/org/apache/commons/dbcp2/PoolableCallableStatement.java index 969a7e1..717e7b2 100644 --- a/src/main/java/org/apache/commons/dbcp2/PoolableCallableStatement.java +++ b/src/main/java/org/apache/commons/dbcp2/PoolableCallableStatement.java @@ -67,9 +67,7 @@ public class PoolableCallableStatement extends DelegatingCallableStatement { // Remove from trace now because this statement will be // added by the activate method. - if (getConnectionInternal() != null) { - getConnectionInternal().removeTrace(this); - } + removeThisTrace(getConnectionInternal()); } /** @@ -115,9 +113,7 @@ public class PoolableCallableStatement extends DelegatingCallableStatement { @Override public void passivate() throws SQLException { setClosedInternal(true); - if (getConnectionInternal() != null) { - getConnectionInternal().removeTrace(this); - } + removeThisTrace(getConnectionInternal()); // The JDBC spec requires that a statement close any open // ResultSet's when it is closed. diff --git a/src/main/java/org/apache/commons/dbcp2/PoolablePreparedStatement.java b/src/main/java/org/apache/commons/dbcp2/PoolablePreparedStatement.java index 15d933e..222de96 100644 --- a/src/main/java/org/apache/commons/dbcp2/PoolablePreparedStatement.java +++ b/src/main/java/org/apache/commons/dbcp2/PoolablePreparedStatement.java @@ -69,9 +69,7 @@ public class PoolablePreparedStatement<K> extends DelegatingPreparedStatement { // Remove from trace now because this statement will be // added by the activate method. - if (getConnectionInternal() != null) { - getConnectionInternal().removeTrace(this); - } + removeThisTrace(getConnectionInternal()); } /** @@ -128,9 +126,7 @@ public class PoolablePreparedStatement<K> extends DelegatingPreparedStatement { clearBatch(); } setClosedInternal(true); - if (getConnectionInternal() != null) { - getConnectionInternal().removeTrace(this); - } + removeThisTrace(getConnectionInternal()); // The JDBC spec requires that a statement closes any open // ResultSet's when it is closed.