You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2014/06/03 20:47:54 UTC

git commit: Fix a startup race condition that could lead to a NPE

Repository: cxf
Updated Branches:
  refs/heads/master 8b457fda0 -> 8c138e035


Fix a startup race condition that could lead to a NPE


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/8c138e03
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/8c138e03
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/8c138e03

Branch: refs/heads/master
Commit: 8c138e03557e85601a5f2a4a10905eda5673590f
Parents: 8b457fd
Author: Daniel Kulp <dk...@apache.org>
Authored: Tue Jun 3 11:52:18 2014 -0400
Committer: Daniel Kulp <dk...@apache.org>
Committed: Tue Jun 3 14:47:51 2014 -0400

----------------------------------------------------------------------
 .../http_jetty/JettyHTTPDestination.java        |  6 ++--
 .../transport/http/AbstractHTTPDestination.java | 33 +++++++++++++-------
 2 files changed, 25 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/8c138e03/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java
----------------------------------------------------------------------
diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java
index c82a9ba..703b552 100644
--- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java
+++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java
@@ -51,6 +51,7 @@ import org.apache.cxf.transport.http.AbstractHTTPDestination;
 import org.apache.cxf.transport.http.DestinationRegistry;
 import org.apache.cxf.transport.http_jetty.continuations.JettyContinuationProvider;
 import org.apache.cxf.transport.https.CertConstraintsJaxBUtils;
+import org.apache.cxf.transports.http.configuration.HTTPServerPolicy;
 import org.eclipse.jetty.http.Generator;
 import org.eclipse.jetty.io.AbstractConnection;
 import org.eclipse.jetty.server.AbstractHttpConnection.Output;
@@ -242,8 +243,9 @@ public class JettyHTTPDestination extends AbstractHTTPDestination {
                 setHeadFalse(c);
             }
         }
-        if (getServer().isSetRedirectURL()) {
-            resp.sendRedirect(getServer().getRedirectURL());
+        HTTPServerPolicy sp = getServer();
+        if (sp.isSetRedirectURL()) {
+            resp.sendRedirect(sp.getRedirectURL());
             resp.flushBuffer();
             baseRequest.setHandled(true);
             return;

http://git-wip-us.apache.org/repos/asf/cxf/blob/8c138e03/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java
----------------------------------------------------------------------
diff --git a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java
index 019a515..62367c5 100644
--- a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java
+++ b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java
@@ -111,7 +111,7 @@ public abstract class AbstractHTTPDestination
     protected final String path;
 
     // Configuration values
-    protected HTTPServerPolicy serverPolicy;
+    protected volatile HTTPServerPolicy serverPolicy;
     protected String contextMatchStrategy = "stem";
     protected boolean fixedParameterOrder;
     protected boolean multiplexWithAddress;
@@ -513,18 +513,28 @@ public abstract class AbstractHTTPDestination
         cproviderFactory = bus.getExtension(ContinuationProviderFactory.class);
     }
 
-    private void calcServerPolicy(Message m) {
+    private synchronized HTTPServerPolicy calcServerPolicyInternal(Message m) {
+        HTTPServerPolicy sp = serverPolicy;
         if (!serverPolicyCalced) {
             PolicyDataEngine pde = bus.getExtension(PolicyDataEngine.class);
             if (pde != null) {
-                serverPolicy = pde.getServerEndpointPolicy(m, endpointInfo, this, new ServerPolicyCalculator());
+                sp = pde.getServerEndpointPolicy(m, endpointInfo, this, new ServerPolicyCalculator());
             }
-            if (null == serverPolicy) {
-                serverPolicy = endpointInfo.getTraversedExtensor(
+            if (null == sp) {
+                sp = endpointInfo.getTraversedExtensor(
                         new HTTPServerPolicy(), HTTPServerPolicy.class);
             }
+            serverPolicy = sp;
+            serverPolicyCalced = true;
+        }
+        return sp;
+    }
+    private HTTPServerPolicy calcServerPolicy(Message m) {
+        HTTPServerPolicy sp = serverPolicy;
+        if (!serverPolicyCalced) {
+            sp = calcServerPolicyInternal(m);
         }
-        serverPolicyCalced = true;
+        return sp;
     }
     
     /**
@@ -581,9 +591,9 @@ public abstract class AbstractHTTPDestination
         }
 
         cacheInput(outMessage);
-        calcServerPolicy(outMessage);
-        if (serverPolicy != null) {
-            new Headers(outMessage).setFromServerPolicy(serverPolicy);
+        HTTPServerPolicy sp = calcServerPolicy(outMessage);
+        if (sp != null) {
+            new Headers(outMessage).setFromServerPolicy(sp);
         }
 
         OutputStream responseStream = null;
@@ -879,8 +889,7 @@ public abstract class AbstractHTTPDestination
     }
 
     public HTTPServerPolicy getServer() {
-        calcServerPolicy(null);
-        return serverPolicy;
+        return calcServerPolicy(null);
     }
 
     public void setServer(HTTPServerPolicy server) {
@@ -892,7 +901,7 @@ public abstract class AbstractHTTPDestination
     
     public void assertMessage(Message message) {
         PolicyDataEngine pde = bus.getExtension(PolicyDataEngine.class);
-        pde.assertMessage(message, serverPolicy, new ServerPolicyCalculator());
+        pde.assertMessage(message, calcServerPolicy(message), new ServerPolicyCalculator());
     }
 
     public boolean canAssert(QName type) {