You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kk...@apache.org on 2011/11/01 20:04:36 UTC

svn commit: r1196212 - in /tomcat/trunk/java/org/apache/coyote/http11: InternalNioInputBuffer.java LocalStrings.properties

Author: kkolinko
Date: Tue Nov  1 19:04:36 2011
New Revision: 1196212

URL: http://svn.apache.org/viewvc?rev=1196212&view=rev
Log:
Add additional state in HTTP Nio connector non-blocking HTTP headers parsing
as a self-guard against unexpected call to parseHeaders() after the parsing has already been completed
without a prior call to recycle() or nextRequest().
One such occurrence was observed because of a bug that did not recycle the buffer and was fixed a while ago.

The request will be rejected with error 400. The message is visible only with debug logging in AbstractHttp11Processor.

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java
    tomcat/trunk/java/org/apache/coyote/http11/LocalStrings.properties

Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java?rev=1196212&r1=1196211&r2=1196212&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java Tue Nov  1 19:04:36 2011
@@ -88,7 +88,11 @@ public class InternalNioInputBuffer exte
         /**
          * Reading all bytes until the next CRLF. The line is being ignored.
          */
-        HEADER_SKIPLINE
+        HEADER_SKIPLINE,
+        /**
+         * Done parsing headers. Request body should follow.
+         */
+        HEADERS_DONE
     }
 
     // ----------------------------------------------------------- Constructors
@@ -469,6 +473,11 @@ public class InternalNioInputBuffer exte
     @Override
     public boolean parseHeaders()
         throws IOException {
+        if (headerParsePos == HeaderParsePosition.HEADERS_DONE) {
+            throw new IllegalStateException(
+                    sm.getString("iib.parseheaders.ise.error"));
+        }
+
         HeaderParseStatus status = HeaderParseStatus.HAVE_MORE_HEADERS;
 
         do {
@@ -527,6 +536,7 @@ public class InternalNioInputBuffer exte
                 // Skip
             } else if (chr == Constants.LF) {
                 pos++;
+                headerParsePos = HeaderParsePosition.HEADERS_DONE;
                 return HeaderParseStatus.DONE;
             } else {
                 break;

Modified: tomcat/trunk/java/org/apache/coyote/http11/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/LocalStrings.properties?rev=1196212&r1=1196211&r2=1196212&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/LocalStrings.properties Tue Nov  1 19:04:36 2011
@@ -28,4 +28,5 @@ http11processor.sendfile.error=Error sen
 iib.eof.error=Unexpected EOF read on the socket
 iib.invalidheader=The HTTP header line [{0}] does not conform to RFC 2616 and has been ignored.
 iib.invalidmethod=Invalid character (CR or LF) found in method name
+iib.parseheaders.ise.error=Unexpected state: headers already parsed. Buffer not recycled?
 iib.requestheadertoolarge.error=Request header is too large



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