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

Reply via email to