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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org