You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2021/06/22 11:02:11 UTC

[tomcat] branch main updated: Update the refactoring to improve thread-safety of JNDIConnection

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

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new 5fe0c9c  Update the refactoring to improve thread-safety of JNDIConnection
5fe0c9c is described below

commit 5fe0c9cd303c1974b21651d9281521ce9c52d659
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Jun 22 12:01:54 2021 +0100

    Update the refactoring to improve thread-safety of JNDIConnection
    
    I'm not planning to back-port this due to the changes in the constructor
---
 java/org/apache/catalina/realm/JNDIRealm.java | 65 +++++++++++++++++----------
 1 file changed, 41 insertions(+), 24 deletions(-)

diff --git a/java/org/apache/catalina/realm/JNDIRealm.java b/java/org/apache/catalina/realm/JNDIRealm.java
index 4949862..ed5b4bd 100644
--- a/java/org/apache/catalina/realm/JNDIRealm.java
+++ b/java/org/apache/catalina/realm/JNDIRealm.java
@@ -445,7 +445,7 @@ public class JNDIRealm extends RealmBase {
     /**
      * Non pooled connection to our directory server.
      */
-    protected JNDIConnection singleConnection = new JNDIConnection();
+    protected JNDIConnection singleConnection;
 
     /**
      * The lock to ensure single connection thread safety.
@@ -2394,6 +2394,9 @@ public class JNDIRealm extends RealmBase {
             }
         } else {
             singleConnectionLock.lock();
+            if (singleConnection == null) {
+                singleConnection = create();
+            }
             connection = singleConnection;
         }
         if (connection.context == null) {
@@ -2426,24 +2429,7 @@ public class JNDIRealm extends RealmBase {
      * @return the new connection
      */
     protected JNDIConnection create() {
-        JNDIConnection connection = new JNDIConnection();
-        if (userSearch != null) {
-            connection.userSearchFormat = new MessageFormat(userSearch);
-        }
-        if (userPattern != null) {
-            int len = userPatternArray.length;
-            connection.userPatternFormatArray = new MessageFormat[len];
-            for (int i = 0; i < len; i++) {
-                connection.userPatternFormatArray[i] = new MessageFormat(userPatternArray[i]);
-            }
-        }
-        if (roleBase != null) {
-            connection.roleBaseFormat = new MessageFormat(roleBase);
-        }
-        if (roleSearch != null) {
-            connection.roleFormat = new MessageFormat(roleSearch);
-        }
-        return connection;
+        return new JNDIConnection(userSearch, userPatternArray, roleBase, roleSearch);
     }
 
 
@@ -3059,29 +3045,60 @@ public class JNDIRealm extends RealmBase {
          * The MessageFormat object associated with the current
          * <code>userSearch</code>.
          */
-        public MessageFormat userSearchFormat = null;
+        public final MessageFormat userSearchFormat;
 
         /**
          * An array of MessageFormat objects associated with the current
          * <code>userPatternArray</code>.
          */
-        public MessageFormat[] userPatternFormatArray = null;
+        public final MessageFormat[] userPatternFormatArray;
 
         /**
          * The MessageFormat object associated with the current
          * <code>roleBase</code>.
          */
-        public MessageFormat roleBaseFormat = null;
+        public final MessageFormat roleBaseFormat;
 
         /**
          * The MessageFormat object associated with the current
          * <code>roleSearch</code>.
          */
-        public MessageFormat roleFormat = null;
+        public final MessageFormat roleFormat ;
 
         /**
          * The directory context linking us to our directory server.
          */
-        public DirContext context = null;
+        public volatile DirContext context = null;
+
+
+        public JNDIConnection(String userSearch, String[] userPatternArray, String roleBase, String roleSearch) {
+            if (userSearch == null) {
+                userSearchFormat = null;
+            } else {
+                userSearchFormat = new MessageFormat(userSearch);
+            }
+
+            if (userPatternArray == null) {
+                userPatternFormatArray = null;
+            } else {
+                int len = userPatternArray.length;
+                userPatternFormatArray = new MessageFormat[len];
+                for (int i = 0; i < len; i++) {
+                    userPatternFormatArray[i] = new MessageFormat(userPatternArray[i]);
+                }
+            }
+
+            if (roleBase == null) {
+                roleBaseFormat = null;
+            } else {
+                roleBaseFormat = new MessageFormat(roleBase);
+            }
+
+            if (roleSearch == null) {
+                roleFormat = null;
+            } else {
+                roleFormat = new MessageFormat(roleSearch);
+            }
+        }
     }
 }

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org