Author: markt Date: Wed Jun 8 14:52:58 2016 New Revision: 1747404 URL: http://svn.apache.org/viewvc?rev=1747404&view=rev Log: Fix a cause of multiple attempts to close the same socket.
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/SocketProcessorBase.java tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java tomcat/trunk/webapps/docs/changelog.xml 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=1747404&r1=1747403&r2=1747404&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Wed Jun 8 14:52:58 2016 @@ -2437,6 +2437,14 @@ public class AprEndpoint extends Abstrac @Override + public boolean isClosed() { + synchronized (closedLock) { + return closed; + } + } + + + @Override protected void doWrite(boolean block) throws IOException { if (closed) { throw new IOException(sm.getString("socket.apr.closed", getSocket())); Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1747404&r1=1747403&r2=1747404&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Wed Jun 8 14:52:58 2016 @@ -895,6 +895,13 @@ public class Nio2Endpoint extends Abstra getSocket().close(); } + + @Override + public boolean isClosed() { + return !getSocket().isOpen(); + } + + @Override public boolean hasAsyncIO() { return false; 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=1747404&r1=1747403&r2=1747404&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Wed Jun 8 14:52:58 2016 @@ -1186,6 +1186,12 @@ public class NioEndpoint extends Abstrac } + @Override + public boolean isClosed() { + return !getSocket().isOpen(); + } + + private int fillReadBuffer(boolean block) throws IOException { int nRead; NioChannel channel = getSocket(); Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketProcessorBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketProcessorBase.java?rev=1747404&r1=1747403&r2=1747404&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/SocketProcessorBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketProcessorBase.java Wed Jun 8 14:52:58 2016 @@ -41,6 +41,14 @@ public abstract class SocketProcessorBas @Override public final void run() { synchronized (socketWrapper) { + // It is possible that processing may be triggered for read and + // write at the same time. The sync above makes sure that processing + // does not occur in parallel. The test below ensures that if the + // first event to be processed results in the socket being closed, + // the subsequent events are not processed. + if (socketWrapper.isClosed()) { + return; + } doRun(); } } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java?rev=1747404&r1=1747403&r2=1747404&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Wed Jun 8 14:52:58 2016 @@ -297,7 +297,7 @@ public abstract class SocketWrapperBase< public abstract void close() throws IOException; - + public abstract boolean isClosed(); /** * Writes the provided data to the socket, buffering any remaining data if @@ -852,5 +852,4 @@ public abstract class SocketWrapperBase< to.put(from); from.limit(fromLimit); } - } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1747404&r1=1747403&r2=1747404&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Wed Jun 8 14:52:58 2016 @@ -45,6 +45,13 @@ issues do not "pop up" wrt. others). --> <section name="Tomcat 9.0.0.M9" rtext="in development"> + <subsection name="Coyote"> + <changelog> + <fix> + Fix a cause of multiple attempts to close the same socket. (markt) + </fix> + </changelog> + </subsection> <subsection name="Other"> <changelog> <fix> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org