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

rmaucher pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit c64102d2acf0731a6f52c59e52479241131dd07a
Author: opencode <[email protected]>
AuthorDate: Wed Sep 30 13:51:13 2026 +0200

    Use the atomic add() of the shared entries set as the name claim in all 
NamingResourcesImpl add*() methods to close the check-then-act race which could 
allow two descriptors with the same JNDI name to both be registered
---
 .../catalina/deploy/NamingResourcesImpl.java       | 73 +++++++++++++---------
 1 file changed, 42 insertions(+), 31 deletions(-)

diff --git a/java/org/apache/catalina/deploy/NamingResourcesImpl.java 
b/java/org/apache/catalina/deploy/NamingResourcesImpl.java
index f330f0ae0f..42e2888686 100644
--- a/java/org/apache/catalina/deploy/NamingResourcesImpl.java
+++ b/java/org/apache/catalina/deploy/NamingResourcesImpl.java
@@ -218,10 +218,9 @@ public class NamingResourcesImpl extends 
LifecycleMBeanBase implements Serializa
             throw new 
IllegalArgumentException(sm.getString("namingResources.ejbLookupLink", 
ejb.getName()));
         }
 
-        if (entries.contains(ejb.getName())) {
+        if (!entries.add(ejb.getName())) {
+            // The name is already claimed, possibly by a concurrent add
             return;
-        } else {
-            entries.add(ejb.getName());
         }
 
         synchronized (ejbs) {
@@ -294,7 +293,10 @@ public class NamingResourcesImpl extends 
LifecycleMBeanBase implements Serializa
             }
         }
 
-        entries.add(environment.getName());
+        if (!entries.add(environment.getName())) {
+            // The name is already claimed, possibly by a concurrent add
+            return;
+        }
 
         synchronized (envs) {
             environment.setNamingResources(this);
@@ -334,10 +336,9 @@ public class NamingResourcesImpl extends 
LifecycleMBeanBase implements Serializa
      */
     public void addLocalEjb(ContextLocalEjb ejb) {
 
-        if (entries.contains(ejb.getName())) {
+        if (!entries.add(ejb.getName())) {
+            // The name is already claimed, possibly by a concurrent add
             return;
-        } else {
-            entries.add(ejb.getName());
         }
 
         synchronized (localEjbs) {
@@ -358,12 +359,16 @@ public class NamingResourcesImpl extends 
LifecycleMBeanBase implements Serializa
 
         if (entries.contains(mdr.getName())) {
             return;
-        } else {
-            if (!checkResourceType(mdr)) {
-                throw new IllegalArgumentException(
-                        sm.getString("namingResources.resourceTypeFail", 
mdr.getName(), mdr.getType()));
-            }
-            entries.add(mdr.getName());
+        }
+
+        if (!checkResourceType(mdr)) {
+            throw new IllegalArgumentException(
+                    sm.getString("namingResources.resourceTypeFail", 
mdr.getName(), mdr.getType()));
+        }
+
+        if (!entries.add(mdr.getName())) {
+            // The name is already claimed, possibly by a concurrent add
+            return;
         }
 
         synchronized (mdrs) {
@@ -392,12 +397,16 @@ public class NamingResourcesImpl extends 
LifecycleMBeanBase implements Serializa
 
         if (entries.contains(resource.getName())) {
             return;
-        } else {
-            if (!checkResourceType(resource)) {
-                throw new IllegalArgumentException(
-                        sm.getString("namingResources.resourceTypeFail", 
resource.getName(), resource.getType()));
-            }
-            entries.add(resource.getName());
+        }
+
+        if (!checkResourceType(resource)) {
+            throw new IllegalArgumentException(
+                    sm.getString("namingResources.resourceTypeFail", 
resource.getName(), resource.getType()));
+        }
+
+        if (!entries.add(resource.getName())) {
+            // The name is already claimed, possibly by a concurrent add
+            return;
         }
 
         synchronized (resources) {
@@ -426,12 +435,16 @@ public class NamingResourcesImpl extends 
LifecycleMBeanBase implements Serializa
 
         if (entries.contains(resource.getName())) {
             return;
-        } else {
-            if (!checkResourceType(resource)) {
-                throw new IllegalArgumentException(
-                        sm.getString("namingResources.resourceTypeFail", 
resource.getName(), resource.getType()));
-            }
-            entries.add(resource.getName());
+        }
+
+        if (!checkResourceType(resource)) {
+            throw new IllegalArgumentException(
+                    sm.getString("namingResources.resourceTypeFail", 
resource.getName(), resource.getType()));
+        }
+
+        if (!entries.add(resource.getName())) {
+            // The name is already claimed, possibly by a concurrent add
+            return;
         }
 
         synchronized (resourceEnvRefs) {
@@ -446,10 +459,9 @@ public class NamingResourcesImpl extends 
LifecycleMBeanBase implements Serializa
     @Override
     public void addResourceLink(ContextResourceLink resourceLink) {
 
-        if (entries.contains(resourceLink.getName())) {
+        if (!entries.add(resourceLink.getName())) {
+            // The name is already claimed, possibly by a concurrent add
             return;
-        } else {
-            entries.add(resourceLink.getName());
         }
 
         synchronized (resourceLinks) {
@@ -476,10 +488,9 @@ public class NamingResourcesImpl extends 
LifecycleMBeanBase implements Serializa
      */
     public void addService(ContextService service) {
 
-        if (entries.contains(service.getName())) {
+        if (!entries.add(service.getName())) {
+            // The name is already claimed, possibly by a concurrent add
             return;
-        } else {
-            entries.add(service.getName());
         }
 
         synchronized (services) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to