poi-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bugzi...@apache.org
Subject DO NOT REPLY [Bug 15807] New: - POIFS may inoorrectly throw exception when opening InputStream with POIFS's file
Date Sun, 05 Jan 2003 19:08:06 GMT
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=15807>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=15807

POIFS may inoorrectly throw exception when opening InputStream with POIFS's file

           Summary: POIFS may inoorrectly throw exception when opening
                    InputStream with POIFS's file
           Product: POI
           Version: 2.0-dev
          Platform: PC
        OS/Version: Windows NT/2K
            Status: NEW
          Severity: Critical
          Priority: Other
         Component: POIFS
        AssignedTo: poi-dev@jakarta.apache.org
        ReportedBy: shimonp@rogers.com
                CC: shimonp@rogers.com


org.apache.poi.poifs.storage.RawDataBlock reads InputStream in chunks of 512 
bytes and throws exception in case chunk is smaller than 512 bytes. However, in 
the world of TCP/IP the chunk can actually be smaller than that. In this case 
POIFS will incorrectly throws exception and will refuse to parse the POIFS file 
despite file is the valid one. To resolve the issue, the constructor of 
RawDataBlock should be changed to read InputStream repeatedly until buffer 512 
bytes is filled in or EOF is reached. I suggest to modify it as follows (we 
tried it successfully here and it works for us - pay attention to internal loop 
in case count != POIFSConstants.BIG_BLOCK_SIZE):
=============
public RawDataBlock(final InputStream stream)
        throws IOException
    {
        _data = new byte[ POIFSConstants.BIG_BLOCK_SIZE ];
        
        _eof = false;
        
        int count = stream.read(_data);

        if (count == -1)
        {
            _eof = true;
        }
        else if (count != POIFSConstants.BIG_BLOCK_SIZE)
        {
            // Shimon: For remote objects read not necessarily returns 512 
bytes.
            // We need to read repeatedly until either buffer filled in or eof 
is reached
            int offset = 0;
            while(count > 0 && offset <= POIFSConstants.BIG_BLOCK_SIZE)
            {
               offset += count;
               count = stream.read(_data, offset, 
POIFSConstants.BIG_BLOCK_SIZE - offset);
               if(count == -1)
               {
                  _eof = true;
                  break;
               }
            }
       
            if(!_eof && count + offset != POIFSConstants.BIG_BLOCK_SIZE)
            {
               String type = " byte" + ((count == 1) ? ("")
                                                     : ("s"));
   
               throw new IOException("Unable to read entire block; " + count
                                     + type + " read; expected "
                                     + POIFSConstants.BIG_BLOCK_SIZE + " 
bytes");
            }   
        }
    }
=============

Mime
View raw message