You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by ms...@apache.org on 2001/11/21 06:04:36 UTC

cvs commit: jakarta-struts/src/share/org/apache/struts/upload BufferedMultipartInputStream.java MultipartIterator.java

mschachter    01/11/20 21:04:36

  Modified:    src/share/org/apache/struts/upload Tag: STRUTS_1_0_BRANCH
                        BufferedMultipartInputStream.java
                        MultipartIterator.java
  Log:
   - fix #3828, equals() method problem (ported from main branch)
     Submitted By: Curt Hagenlocher
  
   - fix #4427, lost bytes on read(byte[],int,int) (need to port to main branch)
     Submitted By: Mike Goutrie
  
   - fix #4701, premature end of input stream not reported (need to port to main branch)
     Submitted By: Roland Huss
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.3.2.4   +40 -40    jakarta-struts/src/share/org/apache/struts/upload/BufferedMultipartInputStream.java
  
  Index: BufferedMultipartInputStream.java
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/upload/BufferedMultipartInputStream.java,v
  retrieving revision 1.3.2.3
  retrieving revision 1.3.2.4
  diff -u -r1.3.2.3 -r1.3.2.4
  --- BufferedMultipartInputStream.java	2001/10/05 20:26:09	1.3.2.3
  +++ BufferedMultipartInputStream.java	2001/11/21 05:04:36	1.3.2.4
  @@ -10,60 +10,60 @@
    * readLine() method.
    */
   public class BufferedMultipartInputStream extends InputStream {
  -   
  +
       /**
        * The underlying InputStream used by this class
        */
       protected InputStream inputStream;
  -    
  +
       /**
        * The byte array used to hold buffered data
        */
       protected byte[] buffer;
  -    
  +
       /**
        * The current offset we're at in the buffer's byte array
        */
       protected int bufferOffset = 0;
  -    
  +
       /**
        * The size of the byte array buffer
        */
       protected int bufferSize = 8192;
  -    
  +
       /**
        * The number of bytes read from the underlying InputStream that are
        * in the buffer
        */
       protected int bufferLength = 0;
  -    
  +
       /**
        * The total number of bytes read so far
        */
       protected int totalLength = 0;
  -    
  +
       /**
        * The content length of the multipart data
        */
       protected long contentLength;
  -    
  +
       /**
        * The maximum allowed size for the multipart data, or -1 for an unlimited
        * maximum file length
        */
       protected long maxSize = -1;
  -    
  +
       /**
        * Whether or not bytes up to the Content-Length have been read
        */
       protected boolean contentLengthMet = false;
  -    
  +
       /**
        * Whether or not bytes up to the maximum length have been read
        */
       protected boolean maxLengthMet = false;
  -    
  -    
  +
  +
       /**
        * Public constructor for this class, just wraps the InputStream
        * given
  @@ -81,14 +81,14 @@
           this.bufferSize = bufferSize;
           this.contentLength = contentLength;
           this.maxSize = maxSize;
  -        
  +
           if (maxSize < contentLength) {
               throw new MaxLengthExceededException(maxSize);
           }
           buffer = new byte[bufferSize];
           fill();
       }
  -    
  +
       /**
        * This method returns the number of available bytes left to read
        * in the buffer before it has to be refilled
  @@ -96,50 +96,50 @@
       public int available() {
           return bufferLength - bufferOffset;
       }
  -    
  +
       /**
        * This method attempts to close the underlying InputStream
        */
       public void close() throws IOException {
           inputStream.close();
       }
  -    
  +
       /**
        * This method calls on the mark() method of the underlying InputStream
        */
       public void mark(int position) {
  -        inputStream.mark(position);  
  -    } 
  -    
  +        inputStream.mark(position);
  +    }
  +
       /**
        * This method calls on the markSupported() method of the underlying InputStream
        * @return Whether or not the underlying InputStream supports marking
        */
       public boolean markSupported() {
  -        return inputStream.markSupported();        
  +        return inputStream.markSupported();
       }
  -    
  +
       /**
        * @return true if the maximum length has been reached, false otherwise
        */
       public boolean maxLengthMet() {
           return maxLengthMet;
       }
  -    
  +
       /**
        * @return true if the content length has been reached, false otherwise
        */
       public boolean contentLengthMet() {
           return contentLengthMet;
       }
  -    
  +
       /**
        * This method returns the next byte in the buffer, and refills it if necessary.
        * @return The next byte read in the buffer, or -1 if the end of the stream has
        *         been reached
        */
       public int read() throws IOException {
  -        
  +
           if (maxLengthMet) {
               throw new MaxLengthExceededException(maxSize);
           }
  @@ -149,34 +149,34 @@
           if (buffer == null) {
               return -1;
           }
  -        
  -        if (bufferOffset < bufferLength) {            
  -            return (int)(char) buffer[bufferOffset++];            
  +
  +        if (bufferOffset < bufferLength) {
  +            return (int)(char) buffer[bufferOffset++];
           }
           fill();
  -        return read();        
  +        return read();
       }
  -    
  +
       /**
        * This method populates the byte array <code>b</code> with data up to
        * <code>b.length</code> bytes
        */
       public int read(byte[] b) throws IOException {
  -        return read(b, 0, b.length);        
  +        return read(b, 0, b.length);
       }
  -    
  +
       /**
  -     * This method populates the byte array <code>b</code> with data up to 
  +     * This method populates the byte array <code>b</code> with data up to
        * <code>length</code> starting at b[offset]
        */
       public int read(byte[] b, int offset, int length) throws IOException {
  -        
  -        int count = 0;
  +
           int read = read();
           if (read == -1) {
               return -1;
           }
  -        
  +        int count = 1;
  +
           while ((read != -1) && (count < length)) {
               b[offset] = (byte) read;
               read = read();
  @@ -185,20 +185,20 @@
           }
           return count;
       }
  -    
  +
       /**
        * This method reads into the byte array <code>b</code> until
        * a newline ('\n') character is encountered or the number of bytes
        * specified by <code>length</code> have been read
        */
       public int readLine(byte[] b, int offset, int length) throws IOException {
  -        
  +
           int count = 0;
           int read = read();
           if (read == -1) {
               return -1;
           }
  -        
  +
           while ((read != -1) && (count < length)) {
               if (read == '\n')
                   break;
  @@ -236,7 +236,7 @@
        * InputStream
        */
       public void reset() throws IOException {
  -        inputStream.reset();        
  +        inputStream.reset();
       }
   
       /**
  @@ -270,7 +270,7 @@
               else {
                   bufferLength = bytesRead;
                   totalLength += bytesRead;
  -                bufferOffset = 0;            
  +                bufferOffset = 0;
               }
           }
       }
  
  
  
  1.13.2.6  +8 -0      jakarta-struts/src/share/org/apache/struts/upload/MultipartIterator.java
  
  Index: MultipartIterator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/upload/MultipartIterator.java,v
  retrieving revision 1.13.2.5
  retrieving revision 1.13.2.6
  diff -u -r1.13.2.5 -r1.13.2.6
  --- MultipartIterator.java	2001/10/05 20:26:09	1.13.2.5
  +++ MultipartIterator.java	2001/11/21 05:04:36	1.13.2.6
  @@ -486,6 +486,10 @@
           BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(tempFile),
                                                               diskBufferSize);
           byte[] lineBuffer = inputStream.readLine();
  +        if (lineBuffer == null)
  +        {
  +            throw new IOException("Premature end of stream while reading multipart request");
  +        }
   	    int bytesRead = lineBuffer.length;
   
           boolean cutCarriage = false;
  @@ -511,6 +515,10 @@
                           cutNewline = true;
                           fos.write(lineBuffer, 0, bytesRead);
                           lineBuffer = inputStream.readLine();
  +                        if (lineBuffer == null)
  +                        {
  +                            throw new IOException("Premature end of stream while reading multipart request");
  +                        }
                           bytesRead = lineBuffer.length;
               }
           }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-struts/src/share/org/apache/struts/upload BufferedMultipartInputStream.java MultipartIterator.java

Posted by Ted Husted <hu...@apache.org>.
So, in the release notes (nightly and 1.0.1) we're saying 

    <li>Improved error-handling on out of bounds conditions</li>

Does that cover well-enough what we're doing here? 

mschachter@apache.org wrote:
> 
> mschachter    01/11/20 21:04:36
> 
>   Modified:    src/share/org/apache/struts/upload Tag: STRUTS_1_0_BRANCH
>                         BufferedMultipartInputStream.java
>                         MultipartIterator.java
>   Log:
>    - fix #3828, equals() method problem (ported from main branch)
>      Submitted By: Curt Hagenlocher
> 
>    - fix #4427, lost bytes on read(byte[],int,int) (need to port to main branch)
>      Submitted By: Mike Goutrie
> 
>    - fix #4701, premature end of input stream not reported (need to port to main branch)
>      Submitted By: Roland Huss
> 
>   Revision  Changes    Path
>   No                   revision
> 
> 
>   No                   revision
> 
> 
>   1.3.2.4   +40 -40    jakarta-struts/src/share/org/apache/struts/upload/BufferedMultipartInputStream.java
> 
>   Index: BufferedMultipartInputStream.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/upload/BufferedMultipartInputStream.java,v
>   retrieving revision 1.3.2.3
>   retrieving revision 1.3.2.4
>   diff -u -r1.3.2.3 -r1.3.2.4
>   --- BufferedMultipartInputStream.java 2001/10/05 20:26:09     1.3.2.3
>   +++ BufferedMultipartInputStream.java 2001/11/21 05:04:36     1.3.2.4
>   @@ -10,60 +10,60 @@
>     * readLine() method.
>     */
>    public class BufferedMultipartInputStream extends InputStream {
>   -
>   +
>        /**
>         * The underlying InputStream used by this class
>         */
>        protected InputStream inputStream;
>   -
>   +
>        /**
>         * The byte array used to hold buffered data
>         */
>        protected byte[] buffer;
>   -
>   +
>        /**
>         * The current offset we're at in the buffer's byte array
>         */
>        protected int bufferOffset = 0;
>   -
>   +
>        /**
>         * The size of the byte array buffer
>         */
>        protected int bufferSize = 8192;
>   -
>   +
>        /**
>         * The number of bytes read from the underlying InputStream that are
>         * in the buffer
>         */
>        protected int bufferLength = 0;
>   -
>   +
>        /**
>         * The total number of bytes read so far
>         */
>        protected int totalLength = 0;
>   -
>   +
>        /**
>         * The content length of the multipart data
>         */
>        protected long contentLength;
>   -
>   +
>        /**
>         * The maximum allowed size for the multipart data, or -1 for an unlimited
>         * maximum file length
>         */
>        protected long maxSize = -1;
>   -
>   +
>        /**
>         * Whether or not bytes up to the Content-Length have been read
>         */
>        protected boolean contentLengthMet = false;
>   -
>   +
>        /**
>         * Whether or not bytes up to the maximum length have been read
>         */
>        protected boolean maxLengthMet = false;
>   -
>   -
>   +
>   +
>        /**
>         * Public constructor for this class, just wraps the InputStream
>         * given
>   @@ -81,14 +81,14 @@
>            this.bufferSize = bufferSize;
>            this.contentLength = contentLength;
>            this.maxSize = maxSize;
>   -
>   +
>            if (maxSize < contentLength) {
>                throw new MaxLengthExceededException(maxSize);
>            }
>            buffer = new byte[bufferSize];
>            fill();
>        }
>   -
>   +
>        /**
>         * This method returns the number of available bytes left to read
>         * in the buffer before it has to be refilled
>   @@ -96,50 +96,50 @@
>        public int available() {
>            return bufferLength - bufferOffset;
>        }
>   -
>   +
>        /**
>         * This method attempts to close the underlying InputStream
>         */
>        public void close() throws IOException {
>            inputStream.close();
>        }
>   -
>   +
>        /**
>         * This method calls on the mark() method of the underlying InputStream
>         */
>        public void mark(int position) {
>   -        inputStream.mark(position);
>   -    }
>   -
>   +        inputStream.mark(position);
>   +    }
>   +
>        /**
>         * This method calls on the markSupported() method of the underlying InputStream
>         * @return Whether or not the underlying InputStream supports marking
>         */
>        public boolean markSupported() {
>   -        return inputStream.markSupported();
>   +        return inputStream.markSupported();
>        }
>   -
>   +
>        /**
>         * @return true if the maximum length has been reached, false otherwise
>         */
>        public boolean maxLengthMet() {
>            return maxLengthMet;
>        }
>   -
>   +
>        /**
>         * @return true if the content length has been reached, false otherwise
>         */
>        public boolean contentLengthMet() {
>            return contentLengthMet;
>        }
>   -
>   +
>        /**
>         * This method returns the next byte in the buffer, and refills it if necessary.
>         * @return The next byte read in the buffer, or -1 if the end of the stream has
>         *         been reached
>         */
>        public int read() throws IOException {
>   -
>   +
>            if (maxLengthMet) {
>                throw new MaxLengthExceededException(maxSize);
>            }
>   @@ -149,34 +149,34 @@
>            if (buffer == null) {
>                return -1;
>            }
>   -
>   -        if (bufferOffset < bufferLength) {
>   -            return (int)(char) buffer[bufferOffset++];
>   +
>   +        if (bufferOffset < bufferLength) {
>   +            return (int)(char) buffer[bufferOffset++];
>            }
>            fill();
>   -        return read();
>   +        return read();
>        }
>   -
>   +
>        /**
>         * This method populates the byte array <code>b</code> with data up to
>         * <code>b.length</code> bytes
>         */
>        public int read(byte[] b) throws IOException {
>   -        return read(b, 0, b.length);
>   +        return read(b, 0, b.length);
>        }
>   -
>   +
>        /**
>   -     * This method populates the byte array <code>b</code> with data up to
>   +     * This method populates the byte array <code>b</code> with data up to
>         * <code>length</code> starting at b[offset]
>         */
>        public int read(byte[] b, int offset, int length) throws IOException {
>   -
>   -        int count = 0;
>   +
>            int read = read();
>            if (read == -1) {
>                return -1;
>            }
>   -
>   +        int count = 1;
>   +
>            while ((read != -1) && (count < length)) {
>                b[offset] = (byte) read;
>                read = read();
>   @@ -185,20 +185,20 @@
>            }
>            return count;
>        }
>   -
>   +
>        /**
>         * This method reads into the byte array <code>b</code> until
>         * a newline ('\n') character is encountered or the number of bytes
>         * specified by <code>length</code> have been read
>         */
>        public int readLine(byte[] b, int offset, int length) throws IOException {
>   -
>   +
>            int count = 0;
>            int read = read();
>            if (read == -1) {
>                return -1;
>            }
>   -
>   +
>            while ((read != -1) && (count < length)) {
>                if (read == '\n')
>                    break;
>   @@ -236,7 +236,7 @@
>         * InputStream
>         */
>        public void reset() throws IOException {
>   -        inputStream.reset();
>   +        inputStream.reset();
>        }
> 
>        /**
>   @@ -270,7 +270,7 @@
>                else {
>                    bufferLength = bytesRead;
>                    totalLength += bytesRead;
>   -                bufferOffset = 0;
>   +                bufferOffset = 0;
>                }
>            }
>        }
> 
> 
> 
>   1.13.2.6  +8 -0      jakarta-struts/src/share/org/apache/struts/upload/MultipartIterator.java
> 
>   Index: MultipartIterator.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/upload/MultipartIterator.java,v
>   retrieving revision 1.13.2.5
>   retrieving revision 1.13.2.6
>   diff -u -r1.13.2.5 -r1.13.2.6
>   --- MultipartIterator.java    2001/10/05 20:26:09     1.13.2.5
>   +++ MultipartIterator.java    2001/11/21 05:04:36     1.13.2.6
>   @@ -486,6 +486,10 @@
>            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(tempFile),
>                                                                diskBufferSize);
>            byte[] lineBuffer = inputStream.readLine();
>   +        if (lineBuffer == null)
>   +        {
>   +            throw new IOException("Premature end of stream while reading multipart request");
>   +        }
>             int bytesRead = lineBuffer.length;
> 
>            boolean cutCarriage = false;
>   @@ -511,6 +515,10 @@
>                            cutNewline = true;
>                            fos.write(lineBuffer, 0, bytesRead);
>                            lineBuffer = inputStream.readLine();
>   +                        if (lineBuffer == null)
>   +                        {
>   +                            throw new IOException("Premature end of stream while reading multipart request");
>   +                        }
>                            bytesRead = lineBuffer.length;
>                }
>            }
> 
> 
> 
> 
> --
> To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
> For additional commands, e-mail: <ma...@jakarta.apache.org>

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>