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]
