Author: markt
Date: Mon Apr 29 11:32:58 2013
New Revision: 1476972

URL: http://svn.apache.org/r1476972
Log:
Explicitly restrict HTTP upgraded connections to a max of one thread for read 
and another for write.

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1476972&r1=1476971&r2=1476972&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Mon Apr 29 
11:32:58 2013
@@ -2172,8 +2172,10 @@ public class AprEndpoint extends Abstrac
             // Upgraded connections need to allow multiple threads to access 
the
             // connection at the same time to enable blocking IO to be used 
when
             // Servlet 3.1 NIO has been configured
-            if (socket.isUpgraded()) {
-                doRun();
+            if (socket.isUpgraded() && SocketStatus.OPEN_WRITE == status) {
+                synchronized (socket.getWriteThreadLock()) {
+                    doRun();
+                }
             } else {
                 synchronized (socket) {
                     doRun();

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1476972&r1=1476971&r2=1476972&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Mon Apr 29 
11:32:58 2013
@@ -1533,8 +1533,11 @@ public class NioEndpoint extends Abstrac
             // Upgraded connections need to allow multiple threads to access 
the
             // connection at the same time to enable blocking IO to be used 
when
             // NIO has been configured
-            if (ka != null && ka.isUpgraded()) {
-                doRun(key, ka);
+            if (ka != null && ka.isUpgraded() &&
+                    SocketStatus.OPEN_WRITE == status) {
+                synchronized (ka.getWriteThreadLock()) {
+                    doRun(key, ka);
+                }
             } else {
                 synchronized (socket) {
                     doRun(key, ka);

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java?rev=1476972&r1=1476971&r2=1476972&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java Mon Apr 29 
11:32:58 2013
@@ -49,6 +49,16 @@ public class SocketWrapper<E> {
     private final Lock blockingStatusReadLock;
     private final WriteLock blockingStatusWriteLock;
 
+    /*
+     * In normal servlet processing only one thread is allowed to access the
+     * socket at a time. That is controlled by a lock on the socket for both
+     * read and writes). When HTTP upgrade is used, one read thread and one
+     * write thread are allowed to access the socket concurrently. In this case
+     * the lock on the socket is used for reads and the lock below is used for
+     * writes.
+     */
+    private final Object writeThreadLock = new Object();
+    public Object getWriteThreadLock() { return writeThreadLock; }
 
     public SocketWrapper(E socket) {
         this.socket = socket;



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

Reply via email to