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

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

commit 53a01e370f3565dc71d90ed3d31637681f62b054
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 1b9c84b10e..86dcde74d4 100644
--- a/java/org/apache/catalina/deploy/NamingResourcesImpl.java
+++ b/java/org/apache/catalina/deploy/NamingResourcesImpl.java
@@ -216,10 +216,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) {
@@ -292,7 +291,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);
@@ -332,10 +334,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) {
@@ -356,12 +357,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) {
@@ -390,12 +395,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) {
@@ -424,12 +433,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) {
@@ -444,10 +457,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) {
@@ -474,10 +486,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