tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Filip Hanik - Dev Lists <devli...@hanik.com>
Subject TC6, Response.recycle question
Date Thu, 13 Jul 2006 01:36:17 GMT
I have a question, I looked at the code for Response.java,
it seems that even if the Request and Response objects have been 
recycled, the ResponseFacade is allowed a reference all the way down to 
the output buffer.
If this output buffer happens to be reused somewhere, for a different 
socket, we  are now writing to the wrong browser.

In Response.java we have the following code:
   public void recycle() {

        outputBuffer.recycle();
        usingOutputStream = false;
        usingWriter = false;
        appCommitted = false;
        included = false;
        error = false;
        isCharacterEncodingSet = false;
       
        cookies.clear();

        if (Constants.SECURITY) {
            if (facade != null) {
                facade.clear(); //why does this only happen when the 
security manager is enabled?
                facade = null;
            }
            if (outputStream != null) {
                outputStream.clear();
                outputStream = null;
            }
            if (writer != null) {
                writer.clear();
                writer = null;
            }
        } else {
            writer.recycle();
        }

    }

would anyone want to explain why the facacde.clear() would only be 
called by with the security manager turned on,
The result of the reference still being valid, can appear when an error 
happens on incoming chunked data on a second or third comet request,
and since the comet still has the reference, it can still try to write, 
and in this case, the socket not being available yields the error,
but the byte buffer is filled up.

java.lang.NullPointerException
    at 
org.apache.coyote.http11.InternalNioOutputBuffer.flushBuffer(InternalNioOutputBuffer.java:723)
    at 
org.apache.coyote.http11.InternalNioOutputBuffer.flush(InternalNioOutputBuffer.java:290)
    at 
org.apache.coyote.http11.Http11NioProcessor.action(Http11NioProcessor.java:1015)
    at org.apache.coyote.Response.action(Response.java:182)
    at 
org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:294)
    at 
org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:268)
    at org.apache.catalina.connector.Response.flushBuffer(Response.java:530)
    at 
org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:277)
    at 
org.hanik.comet.test.TestCometServlet$MyCometThread.run(TestCometServlet.java:88)

I'm looking to be enlightened....

thanks
Filip


java.lang.NullPointerException (the blocking http connection)
    at 
org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:772)
    at 
org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:123)
    at 
org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:579)
    at org.apache.coyote.Response.doWrite(Response.java:559)
    at 
org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:333)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433)
    at 
org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:289)
    at 
org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:268)
    at org.apache.catalina.connector.Response.flushBuffer(Response.java:530)
    at 
org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:277)
    at 
org.hanik.comet.test.TestCometServlet$MyCometThread.run(TestCometServlet.java:84)


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


Mime
View raw message