You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by bi...@apache.org on 2007/10/21 10:31:16 UTC

svn commit: r586870 - /tomcat/connectors/trunk/jk/java/org/apache/jk/common/ChannelNioSocket.java

Author: billbarker
Date: Sun Oct 21 01:31:12 2007
New Revision: 586870

URL: http://svn.apache.org/viewvc?rev=586870&view=rev
Log:
Fix possible DoS condition for the experimental NIO/AJP module 

Fix for bug #43621

Reported By: William Leung

Modified:
    tomcat/connectors/trunk/jk/java/org/apache/jk/common/ChannelNioSocket.java

Modified: tomcat/connectors/trunk/jk/java/org/apache/jk/common/ChannelNioSocket.java
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/java/org/apache/jk/common/ChannelNioSocket.java?rev=586870&r1=586869&r2=586870&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/java/org/apache/jk/common/ChannelNioSocket.java (original)
+++ tomcat/connectors/trunk/jk/java/org/apache/jk/common/ChannelNioSocket.java Sun Oct 21 01:31:12 2007
@@ -36,6 +36,7 @@
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.SocketException;
+import java.net.SocketTimeoutException;
 
 import javax.management.ListenerNotFoundException;
 import javax.management.MBeanNotificationInfo;
@@ -882,6 +883,8 @@
 
         synchronized void  process(SelectionKey sk) {
             if(!sk.isValid()) {
+                SocketInputStream sis = (SocketInputStream)ep.getNote(isNote);
+                sis.closeIt();
                 return;
             }
             if(sk.isReadable()) {
@@ -959,15 +962,11 @@
                         Iterator it = sels.iterator();
                         while(it.hasNext()) {
                             SelectionKey sk = (SelectionKey)it.next();
-                            if(sk.isValid()) {
-                                if(sk.isAcceptable()) {
-                                    acceptConnections();
-                                } else {
-                                    SocketConnection sc = (SocketConnection)sk.attachment();
-                                    sc.process(sk);
-                                }
+                            if(sk.isAcceptable()) {
+                                acceptConnections();
                             } else {
-                                sk.cancel();
+                                SocketConnection sc = (SocketConnection)sk.attachment();
+                                sc.process(sk);
                             }
                             it.remove();
                         }
@@ -1081,8 +1080,7 @@
                     nr = -1; // Can't handle this yet
                 }
                 if(nr < 0) {
-                    isClosed = true;
-                    notify();
+                    closeIt();
                     return false;
                 } else if(nr == 0) {
                     if(!nioIsBroken) {
@@ -1093,6 +1091,12 @@
             return true;
         }
 
+        synchronized void closeIt() {
+            isClosed = true;
+            if(blocking)
+                notify();
+        }
+
         public int read(byte [] data) throws IOException {
             return read(data, 0, data.length);
         }
@@ -1132,7 +1136,9 @@
                 if(fill(len) < 0) {
                     isClosed = true;
                 } 
-            }
+            } else if(!isClosed) {
+		throw new SocketTimeoutException("Read request timed out");
+	    }
         }
     }
 



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