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 2014/08/05 17:15:00 UTC

svn commit: r1615942 - in /tomcat/trunk: java/org/apache/catalina/core/ContainerBase.java java/org/apache/catalina/core/StandardContext.java webapps/docs/changelog.xml

Author: markt
Date: Tue Aug  5 15:15:00 2014
New Revision: 1615942

URL: http://svn.apache.org/r1615942
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56784
Fix a couple of rare but theoretically possible atomicity bugs.

Modified:
    tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java?rev=1615942&r1=1615941&r2=1615942&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java Tue Aug  5 15:15:00 2014
@@ -1267,16 +1267,15 @@ public abstract class ContainerBase exte
     }
 
     public ObjectName[] getChildren() {
-        ObjectName result[]=new ObjectName[children.size()];
-        Iterator<Container> it=children.values().iterator();
-        int i=0;
-        while( it.hasNext() ) {
-            Object next=it.next();
-            if( next instanceof ContainerBase ) {
-                result[i++]=((ContainerBase)next).getObjectName();
+        List<ObjectName> names = new ArrayList<>(children.size());
+        Iterator<Container>  it = children.values().iterator();
+        while (it.hasNext()) {
+            Object next = it.next();
+            if (next instanceof ContainerBase) {
+                names.add(((ContainerBase)next).getObjectName());
             }
         }
-        return result;
+        return names.toArray(new ObjectName[names.size()]);
     }
 
 

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1615942&r1=1615941&r2=1615942&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Tue Aug  5 15:15:00 2014
@@ -41,6 +41,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.Stack;
 import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
@@ -469,7 +470,7 @@ public class StandardContext extends Con
      * The context initialization parameters for this web application,
      * keyed by name.
      */
-    private HashMap<String, String> parameters = new HashMap<>();
+    private final ConcurrentHashMap<String, String> parameters = new ConcurrentHashMap<>();
 
 
     /**
@@ -3009,19 +3010,20 @@ public class StandardContext extends Con
     @Override
     public void addParameter(String name, String value) {
         // Validate the proposed context initialization parameter
-        if ((name == null) || (value == null))
+        if ((name == null) || (value == null)) {
             throw new IllegalArgumentException
                 (sm.getString("standardContext.parameter.required"));
-        if (parameters.get(name) != null)
-            throw new IllegalArgumentException
-                (sm.getString("standardContext.parameter.duplicate", name));
+        }
 
-        // Add this parameter to our defined set
-        synchronized (parameters) {
-            parameters.put(name, value);
+        // Add this parameter to our defined set if not already present
+        String oldValue = parameters.putIfAbsent(name, value);
+
+        if (oldValue != null) {
+            throw new IllegalArgumentException(
+                    sm.getString("standardContext.parameter.duplicate", name));
         }
-        fireContainerEvent("addParameter", name);
 
+        fireContainerEvent("addParameter", name);
     }
 
 
@@ -3515,11 +3517,7 @@ public class StandardContext extends Con
      */
     @Override
     public String findParameter(String name) {
-
-        synchronized (parameters) {
-            return (parameters.get(name));
-        }
-
+        return parameters.get(name);
     }
 
 
@@ -3530,12 +3528,9 @@ public class StandardContext extends Con
      */
     @Override
     public String[] findParameters() {
-
-        synchronized (parameters) {
-            String results[] = new String[parameters.size()];
-            return (parameters.keySet().toArray(results));
-        }
-
+        List<String> parameterNames = new ArrayList<>(parameters.size());
+        parameterNames.addAll(parameters.keySet());
+        return parameterNames.toArray(new String[parameterNames.size()]);
     }
 
 
@@ -4079,12 +4074,8 @@ public class StandardContext extends Con
      */
     @Override
     public void removeParameter(String name) {
-
-        synchronized (parameters) {
-            parameters.remove(name);
-        }
+        parameters.remove(name);
         fireContainerEvent("removeParameter", name);
-
     }
 
 

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1615942&r1=1615941&r2=1615942&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Aug  5 15:15:00 2014
@@ -81,6 +81,10 @@
         Cédric Couralet. (markt)
       </fix>
       <fix>
+        <bug>56784</bug>: Fix a couple of rare but theoretically possible
+        atomicity bugs. (markt)
+      </fix>
+      <fix>
         <bug>56785</bug>: Avoid <code>NullPointerException</code> if directory
         exists on the class path that is not readable by the Tomcat user.
         (markt)



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