Author: remm Date: Mon Nov 2 16:46:59 2015 New Revision: 1712081 URL: http://svn.apache.org/viewvc?rev=1712081&view=rev Log: - 57799: Some blocking IO code uses InputStream.available() (a useless call that has always been in the java.io API). Following the introduction of non blocking, available() now causes real IO to occur. While this should be mostly harmless for APR and NIO (which can "read" 0 bytes), it would leave an async read pending with NIO2. The read IO operation will now not occur unless a read listener has been set (in which case available() is mostly equivalent to the newer isReady() method). - Also add a missing i18n. - Adapt patch from trunk to the 8 connectors.
Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1712081&r1=1712080&r2=1712081&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java Mon Nov 2 16:46:59 2015 @@ -241,7 +241,7 @@ public class InputBuffer extends Reader available = cb.getLength(); } if (available == 0) { - coyoteRequest.action(ActionCode.AVAILABLE, null); + coyoteRequest.action(ActionCode.AVAILABLE, Boolean.valueOf(coyoteRequest.getReadListener() != null)); available = (coyoteRequest.getAvailable() > 0) ? 1 : 0; } return available; @@ -286,7 +286,7 @@ public class InputBuffer extends Reader public boolean isReady() { if (coyoteRequest.getReadListener() == null) { - throw new IllegalStateException("not in non blocking mode."); + throw new IllegalStateException(sm.getString("inputBuffer.requiresNonBlocking")); } // Need to check is finished before we check available() as BIO always // returns 1 for isAvailable() Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1712081&r1=1712080&r2=1712081&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties Mon Nov 2 16:46:59 2015 @@ -68,6 +68,7 @@ coyoteResponse.sendRedirect.note=<html>< coyoteResponse.setBufferSize.ise=Cannot change buffer size after data has been written inputBuffer.streamClosed=Stream closed +inputBuffer.requiresNonBlocking=Not available in non blocking mode outputBuffer.writeNull=The String argument to write(String,int,int) may not be null Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1712081&r1=1712080&r2=1712081&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Mon Nov 2 16:46:59 2015 @@ -873,7 +873,7 @@ public abstract class AbstractHttp11Proc break; } case AVAILABLE: { - request.setAvailable(inputBuffer.available()); + request.setAvailable(inputBuffer.available(param == Boolean.TRUE)); break; } case NB_WRITE_INTEREST: { Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java?rev=1712081&r1=1712080&r2=1712081&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java Mon Nov 2 16:46:59 2015 @@ -326,14 +326,14 @@ public abstract class AbstractInputBuffe * Available bytes in the buffers (note that due to encoding, this may not * correspond). */ - public int available() { + public int available(boolean read) { int available = lastValid - pos; if ((available == 0) && (lastActiveFilter >= 0)) { for (int i = 0; (available == 0) && (i <= lastActiveFilter); i++) { available = activeFilters[i].available(); } } - if (available > 0) { + if (available > 0 || !read) { return available; } Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java?rev=1712081&r1=1712080&r2=1712081&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java Mon Nov 2 16:46:59 2015 @@ -76,7 +76,7 @@ public class InternalInputBuffer extends * tested for == 0 or > 0. */ @Override - public int available() { + public int available(boolean read) { return 1; } Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1712081&r1=1712080&r2=1712081&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Mon Nov 2 16:46:59 2015 @@ -125,6 +125,11 @@ Add a new RestCsrfPreventionFilter that provides basic CSRF protection for REST APIs. (violetagg) </add> + <fix> + <bug>57799</bug>: InputStream.available() was causing an IO operation + to occur even in blocking mode, which caused problems with NIO2. + (remm) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org