https://issues.apache.org/bugzilla/show_bug.cgi?id=50394

           Summary: InternalAprInputBuffer.fill() doesn't deal correctly
                    with EOF
           Product: Tomcat Native
           Version: 1.1.20
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Library
        AssignedTo: dev@tomcat.apache.org
        ReportedBy: h...@acunu.com


I'm using tomcat-native-1.1.20 and tomcat-6.0.29 on CentOS 5.5, and I've
written a servlet that is sent large (gigabyte) streams of bytes over HTTP.

>From time to time it fails with the following stacktrace:


Caused by: java.io.IOException
        at
org.apache.coyote.http11.InternalAprInputBuffer.fill(InternalAprInputBuffer.java:798)
        at
org.apache.coyote.http11.InternalAprInputBuffer$SocketInputBuffer.doRead(InternalAprInputBuffer.java:827)
        at
org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:116)
        at
org.apache.coyote.http11.InternalAprInputBuffer.doRead(InternalAprInputBuffer.java:738)
        at org.apache.coyote.Request.doRead(Request.java:428)
        at
org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:304)
        at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:403)
        at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:327)
        at
org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:193)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
        at java.io.FilterInputStream.read(FilterInputStream.java:107)
[...]


Unfortunately, InternalAprInputBuffer throws away the error code on line 798,
but I've run it under a debugger and nRead was -70014.

If you look in the source of apr-1.3.8 at include/apr_errno.h, you'll see this
is -APR_EOF.

The bug is in the implementation of recvbb at line 892 onwards in
tomcat-native-1.1.20-src/jni/native/src/network.c. Specifically, at the end of
the function we check for APR_SUCCESS, and assume all other codes are an error,
returning -ss. It should also check for EOF (APR_STATUS_IS_EOF), and return
zero. (Or at least, InternalAprInputBuffer assumes that a return code of 0 <=>
EOF).

Incidentally, apr-1.3.8/include/apr_network_io.h says in its comment on
apr_socket_recv() that "It is possible for both bytes to be received and an
APR_EOF or other error to be returned.". This is a lie. All provided
implementations of apr_socket_recv return with *len == 0 in case of APR_EOF.

-- 
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.

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

Reply via email to