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:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to