Author: markt Date: Tue Nov 26 19:56:54 2013 New Revision: 1545801 URL: http://svn.apache.org/r1545801 Log: Avoid NPEs if asyncContext is completed by listener
Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1545801&r1=1545800&r2=1545801&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Tue Nov 26 19:56:54 2013 @@ -25,6 +25,7 @@ import java.util.concurrent.atomic.Atomi import javax.servlet.ReadListener; import javax.servlet.RequestDispatcher; import javax.servlet.SessionTrackingMode; +import javax.servlet.WriteListener; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.Context; @@ -313,14 +314,15 @@ public class CoyoteAdapter implements Ad Throwable t = (Throwable)req.getAttribute( RequestDispatcher.ERROR_EXCEPTION); req.getAttributes().remove(RequestDispatcher.ERROR_EXCEPTION); - if (req.getReadListener() != null) { + ReadListener readListener = req.getReadListener(); + if (readListener != null) { ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); ClassLoader newCL = request.getContext().getLoader().getClassLoader(); try { Thread.currentThread().setContextClassLoader(newCL); - req.getReadListener().onError(t); + readListener.onError(t); } finally { Thread.currentThread().setContextClassLoader(oldCL); } @@ -355,8 +357,9 @@ public class CoyoteAdapter implements Ad // Check to see if non-blocking writes or reads are being used if (!request.isAsyncDispatching() && request.isAsync()) { - if (res.getWriteListener() != null && - status == SocketStatus.OPEN_WRITE) { + WriteListener writeListener = res.getWriteListener(); + ReadListener readListener = req.getReadListener(); + if (writeListener != null && status == SocketStatus.OPEN_WRITE) { ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); ClassLoader newCL = @@ -364,32 +367,32 @@ public class CoyoteAdapter implements Ad try { Thread.currentThread().setContextClassLoader(newCL); res.onWritePossible(); - if (request.isFinished() && req.sendAllDataReadEvent()) { - req.getReadListener().onAllDataRead(); + if (request.isFinished() && req.sendAllDataReadEvent() && + readListener != null) { + readListener.onAllDataRead(); } } catch (Throwable t) { ExceptionUtils.handleThrowable(t); - res.getWriteListener().onError(t); + writeListener.onError(t); throw t; } finally { Thread.currentThread().setContextClassLoader(oldCL); } success = true; - } else if (req.getReadListener() != null && - status == SocketStatus.OPEN_READ) { + } else if (readListener != null && status == SocketStatus.OPEN_READ) { ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); ClassLoader newCL = request.getContext().getLoader().getClassLoader(); try { Thread.currentThread().setContextClassLoader(newCL); - req.getReadListener().onDataAvailable(); + readListener.onDataAvailable(); if (request.isFinished() && req.sendAllDataReadEvent()) { - req.getReadListener().onAllDataRead(); + readListener.onAllDataRead(); } } catch (Throwable t) { ExceptionUtils.handleThrowable(t); - req.getReadListener().onError(t); + readListener.onError(t); throw t; } finally { Thread.currentThread().setContextClassLoader(oldCL); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org