Author: markt
Date: Tue Jul  2 13:27:46 2013
New Revision: 1498929

URL: http://svn.apache.org/r1498929
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55171
If the client closed the connection, the write of any remainign data in the 
buffer in AbstractServletOutputStream would fail but the remote endpoint was 
not notified. This meant that blocking writes would block for ever eventually 
locking up the entire server.
Modified:
    
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
    
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
    
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java

Modified: 
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java?rev=1498929&r1=1498928&r2=1498929&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
 (original)
+++ 
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java
 Tue Jul  2 13:27:46 2013
@@ -21,6 +21,7 @@ import java.io.IOException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.WriteListener;
 
+import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.res.StringManager;
 
 public abstract class AbstractServletOutputStream extends ServletOutputStream {
@@ -127,7 +128,17 @@ public abstract class AbstractServletOut
 
     protected final void onWritePossible() throws IOException {
         synchronized (writeLock) {
-            writeInternal(buffer, 0, buffer.length);
+            try {
+                writeInternal(buffer, 0, buffer.length);
+            } catch (Throwable t) {
+                ExceptionUtils.handleThrowable(t);
+                listener.onError(t);
+                if (t instanceof IOException) {
+                    throw t;
+                } else {
+                    throw new IOException(t);
+                }
+            }
 
            // Make sure isReady() and onWritePossible() have a consistent view 
of
             // buffer and fireListener when determining if the listener should 
fire

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java?rev=1498929&r1=1498928&r2=1498929&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 
Tue Jul  2 13:27:46 2013
@@ -492,7 +492,7 @@ public abstract class WsRemoteEndpointIm
     }
 
 
-    protected final void close() {
+    public final void close() {
         for (EncoderEntry entry : encoderEntries) {
             entry.getEncoder().destroy();
         }

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java?rev=1498929&r1=1498928&r2=1498929&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java 
(original)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java 
Tue Jul  2 13:27:46 2013
@@ -237,6 +237,7 @@ public class WsHttpUpgradeHandler implem
         @Override
         public void onError(Throwable throwable) {
             wsProtocolHandler.onError(throwable);
+            wsRemoteEndpointServer.close();
         }
     }
 }

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java?rev=1498929&r1=1498928&r2=1498929&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
 Tue Jul  2 13:27:46 2013
@@ -16,6 +16,7 @@
  */
 package org.apache.tomcat.websocket.server;
 
+import java.io.EOFException;
 import java.io.IOException;
 import java.net.SocketTimeoutException;
 import java.nio.ByteBuffer;
@@ -121,6 +122,9 @@ public class WsRemoteEndpointImplServer 
 
     @Override
     protected void doClose() {
+        if (handler != null) {
+            clearHandler(new EOFException());
+        }
         try {
             sos.close();
         } catch (IOException e) {
@@ -138,8 +142,8 @@ public class WsRemoteEndpointImplServer 
 
 
     protected void onTimeout() {
-        close();
         clearHandler(new SocketTimeoutException());
+        close();
     }
 
 



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

Reply via email to