From: markt Date: Thu, 7 Oct 2010 21:53:55 +0000 (+0000) Subject: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49987 X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=3e52e910e5adc04609a69334e5a2901c800b121e;p=tomcat7.0 Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49987 Fix thread safety issue with population of servlet context initialization parameters. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1005647 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/core/ApplicationContext.java b/java/org/apache/catalina/core/ApplicationContext.java index c216d49cc..d76c720cf 100644 --- a/java/org/apache/catalina/core/ApplicationContext.java +++ b/java/org/apache/catalina/core/ApplicationContext.java @@ -66,7 +66,6 @@ import org.apache.catalina.LifecycleState; import org.apache.catalina.Service; import org.apache.catalina.Wrapper; import org.apache.catalina.connector.Connector; -import org.apache.catalina.deploy.ApplicationParameter; import org.apache.catalina.deploy.FilterDef; import org.apache.catalina.util.Enumerator; import org.apache.catalina.util.RequestUtil; @@ -173,7 +172,8 @@ public class ApplicationContext /** * The merged context initialization parameters for this Context. */ - private Map parameters = null; + private Map parameters = + new ConcurrentHashMap(); /** @@ -317,10 +317,7 @@ public class ApplicationContext * @param name Name of the initialization parameter to retrieve */ public String getInitParameter(final String name) { - - mergeParameters(); return parameters.get(name); - } @@ -329,10 +326,7 @@ public class ApplicationContext * empty enumeration if the context has no initialization parameters. */ public Enumeration getInitParameterNames() { - - mergeParameters(); return (new Enumerator(parameters.keySet())); - } @@ -1215,9 +1209,6 @@ public class ApplicationContext @Override public boolean setInitParameter(String name, String value) { - - mergeParameters(); - if (parameters.containsKey(name)) { return false; } @@ -1509,38 +1500,6 @@ public class ApplicationContext this.newServletContextListenerAllowed = allowed; } - // -------------------------------------------------------- Private Methods - - - /** - * Merge the context initialization parameters specified in the application - * deployment descriptor with the application parameters described in the - * server configuration, respecting the override property of - * the application parameters appropriately. - */ - private void mergeParameters() { - - if (parameters != null) - return; - Map results = new ConcurrentHashMap(); - String names[] = context.findParameters(); - for (int i = 0; i < names.length; i++) - results.put(names[i], context.findParameter(names[i])); - ApplicationParameter params[] = - context.findApplicationParameters(); - for (int i = 0; i < params.length; i++) { - if (params[i].getOverride()) { - if (results.get(params[i].getName()) == null) - results.put(params[i].getName(), params[i].getValue()); - } else { - results.put(params[i].getName(), params[i].getValue()); - } - } - parameters = results; - - } - - /** * List resource paths (recursively), and store all of them in the given * Set. diff --git a/java/org/apache/catalina/core/StandardContext.java b/java/org/apache/catalina/core/StandardContext.java index 76a84a0f0..b80276fc0 100644 --- a/java/org/apache/catalina/core/StandardContext.java +++ b/java/org/apache/catalina/core/StandardContext.java @@ -4770,6 +4770,9 @@ public class StandardContext extends ContainerBase postWelcomeFiles(); } + // Set up the context init params + mergeParameters(); + // Call ServletContainerInitializers for (Map.Entry>> entry : initializers.entrySet()) { @@ -4896,6 +4899,36 @@ public class StandardContext extends ContainerBase } } + + + /** + * Merge the context initialization parameters specified in the application + * deployment descriptor with the application parameters described in the + * server configuration, respecting the override property of + * the application parameters appropriately. + */ + private void mergeParameters() { + ServletContext sc = getServletContext(); + + String names[] = findParameters(); + for (int i = 0; i < names.length; i++) { + sc.setInitParameter(names[i], findParameter(names[i])); + } + + ApplicationParameter params[] = findApplicationParameters(); + for (int i = 0; i < params.length; i++) { + if (params[i].getOverride()) { + if (sc.getInitParameter(params[i].getName()) == null) { + sc.setInitParameter(params[i].getName(), + params[i].getValue()); + } + } else { + sc.setInitParameter(params[i].getName(), params[i].getValue()); + } + } + } + + /** * Stop this component and implement the requirements * of {@link LifecycleBase#stopInternal()}. diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index e08d14840..db8c2a4a7 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -81,6 +81,10 @@ than throwing an exception and failing to start, allow thw web application to start normally. (mark) + + 49987: Fix thread safety issue with population of servlet + context initialization parameters. (markt) +