Hi!

The bug is fixed since Version 2.1 of the API. So if you use a 
2.1-capable-Servlet-Engine (jo!, Netforge od JRun
2.3), you don't have to work around it.

cheers,

-hendrik
- - - - - - - - - - - - - - - - - - - - - - - -
 The WebApp Framework ~ http://www.webapp.de/

David Kamber wrote:

> Hi,
>
> you may want to take note of the following bug in the
> javax.servlet.ServletInputStream class:
>
> [begin orginal code form Servlet SDK 2.0]
>     /**
>      * Starting at the specified offset, reads into the given array of
>      * bytes until all requested bytes have been read or a '\n' is
>      * encountered, in which case the '\n' is read into the array as well.
>      * @param b the buffer into which the data is read
>      * @param off the start offset of the data
>      * @param len the maximum number of bytes to read
>      * @return the actual number of bytes read, or -1 if the end of the
>      *         stream is reached
>      * @exception IOException if an I/O error has occurred
>      */
>     public int readLine(byte[] b, int off, int len) throws IOException {
>         if (len <= 0) {
>             return 0;
>         }
>         int count = 0, c;
>         while ((c = read()) != -1) {
>             b[off++] = (byte)c;
>             count++;
>             if (c == '\n') {
>                 break;
>             }
>         }
>         return count > 0 ? count : -1;
>     }
> }
> [end orginal code form Servlet SDK 2.0]
>
> As you can see in the code above, the parameter len is only checked for being
> negative (and no read will occur) and never anywhere else. Now if you read a
> binary file and provide not too big a buffer (as in my case) it's very likely
> that you run into an array-out-of-bounds exception because there was no newline
> char anywhere in the input stream, e. g. you provide a 100 byte buffer and
> request 100 bytes, if there's no newline withing the next 100 bytes on the input
> stream then you crash.
>
> You can fix this by using the code below (full file attached):
>
> [begin excerpt dk fix]
>     public int readLine(byte[] b, int off, int len) throws IOException {
>         if (len <= 0) {
>             return 0;
>         }
>         int count = 0, c;
>         while ((c = read()) != -1) {
>             b[off++] = (byte)c;
>             count++;
>
>             // begin dk fix
>             if( count >= len ) {
>                 break;
>             }
>             // end dk fix
>
>             if (c == '\n') {
>                 break;
>             }
>         }
>         return count > 0 ? count : -1;
>     }
> [end excerpt dk fix]
>
> Using the code attached below, my file uploads now work fine ;-)
>
> Cheers,
>
> ++dk
>
> --
> David Kamber
> Senior Consultant                       Phone:   +41  1 308 5111
> World Wide Professional Services        Direct:  +41  1 308 5143
> Netscape Communications                 Mobile:  +41 79 422 4445
> Thurgauerstrasse 66                     Fax:     +41  1 308 5100
> CH - 8050 Zurich                        <mailto:[EMAIL PROTECTED]>
>        -- exoriare aliquis nostris ex ossibus ultor! --
>
>   ------------------------------------------------------------------------
>                               Name: ServletInputStream.java
>    ServletInputStream.java    Type: Visual Cafe File 
>(application/x-unknown-content-type-VisualCafeFile.Document)

___________________________________________________________________________
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff SERVLET-INTEREST".

Archives: http://archives.java.sun.com/archives/servlet-interest.html
Resources: http://java.sun.com/products/servlet/external-resources.html
LISTSERV Help: http://www.lsoft.com/manuals/user/user.html

Reply via email to