Repository: commons-dbcp
Updated Branches:
  refs/heads/master 323d3fbae -> a6feb941e


[DBCP-486] DriverAdapterCPDS.setUser(), setPassword(), and
getPooledConnection() with null arguments throw NullPointerExceptions
when connection properties are set

Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/a6feb941
Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/a6feb941
Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/a6feb941

Branch: refs/heads/master
Commit: a6feb941e5ff8fde22865f981d912c6d5f48546e
Parents: 323d3fb
Author: Gary Gregory <garydgreg...@gmail.com>
Authored: Wed Apr 18 16:33:16 2018 -0600
Committer: Gary Gregory <garydgreg...@gmail.com>
Committed: Wed Apr 18 16:33:16 2018 -0600

----------------------------------------------------------------------
 src/changes/changes.xml                         |  2 +-
 .../dbcp2/cpdsadapter/DriverAdapterCPDS.java    | 30 +++++++++-----------
 .../dbcp2/managed/ManagedConnection.java        | 20 +++++++------
 3 files changed, 27 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a6feb941/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 8f69ffb..7abec82 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -68,7 +68,7 @@ The <action> type attribute can be add,update,fix,remove.
         Make constant public: 
org.apache.commons.dbcp2.PoolingDriver.URL_PREFIX.
       </action>
       <action dev="ggregory" type="update" issue="DBCP-486" due-to="Gary 
Gregory">
-        DriverAdapterCPDS.setUser(null) and setPassword(null) throw 
NullPointerExceptions when connection properties are set.
+        DriverAdapterCPDS.setUser(), setPassword(), and getPooledConnection() 
with null arguments throw NullPointerExceptions when connection properties are 
set.
       </action>
     </release>
     <release version="2.2.0" date="2017-12-DD" description="This is a minor 
release, including bug fixes and enhancements.">

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a6feb941/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java 
b/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java
index bf7d960..748dec7 100644
--- a/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java
+++ b/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java
@@ -177,8 +177,8 @@ public class DriverAdapterCPDS
         // exception upon first invocation.
         try {
             if (connectionProperties != null) {
-                connectionProperties.put(KEY_USER, username);
-                connectionProperties.put(KEY_PASSWORD, pass);
+                update(connectionProperties, KEY_USER, username);
+                update(connectionProperties, KEY_PASSWORD, pass);
                 pci = new PooledConnectionImpl(DriverManager.getConnection(
                         getUrl(), connectionProperties));
             } else {
@@ -442,13 +442,7 @@ public class DriverAdapterCPDS
     public void setPassword(final String v) {
         assertInitializationAllowed();
         this.password = v;
-        if (connectionProperties != null) {
-            if (v == null) {
-                connectionProperties.remove(KEY_PASSWORD);
-            } else {
-                connectionProperties.setProperty(KEY_PASSWORD, v);
-            }
-        }
+        update(connectionProperties, KEY_PASSWORD, v);
     }
 
     /**
@@ -485,13 +479,7 @@ public class DriverAdapterCPDS
     public void setUser(final String v) {
         assertInitializationAllowed();
         this.user = v;
-        if (connectionProperties != null) {
-            if (v == null) {
-                connectionProperties.remove(KEY_USER);
-            } else {
-                connectionProperties.setProperty(KEY_USER, v);
-            }
-        }
+        update(connectionProperties, KEY_USER, v);
     }
 
     /**
@@ -716,4 +704,14 @@ public class DriverAdapterCPDS
     {
         _maxPreparedStatements = maxPreparedStatements;
     }
+    
+    private void update(final Properties properties, final String key, final 
String value) {
+        if (properties != null) {
+            if (value == null) {
+                properties.remove(key);
+            } else {
+                properties.setProperty(key, value);
+            }
+        }        
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a6feb941/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java 
b/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java
index a66a7a8..d05144b 100644
--- a/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java
+++ b/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java
@@ -159,14 +159,16 @@ public class ManagedConnection<C extends Connection> 
extends DelegatingConnectio
     @Override
     public void close() throws SQLException {
         if (!isClosedInternal()) {
-            try {
-                // Don't actually close the connection if in a transaction. The
-                // connection will be closed by the transactionComplete method.
-                if (transactionContext == null) {
-                    super.close();
+            synchronized (this) {
+                try {
+                    // Don't actually close the connection if in a 
transaction. The
+                    // connection will be closed by the transactionComplete 
method.
+                    if (transactionContext == null) {
+                        super.close();
+                    }
+                } finally {
+                    setClosedInternal(true);
                 }
-            } finally {
-                setClosedInternal(true);
             }
         }
     }
@@ -186,7 +188,9 @@ public class ManagedConnection<C extends Connection> 
extends DelegatingConnectio
     }
 
     protected void transactionComplete() {
-        transactionContext = null;
+        synchronized (this) {
+            transactionContext = null;
+        }
 
         // If we were using a shared connection, clear the reference now that
         // the transaction has completed

Reply via email to