]> source.dussan.org Git - poi.git/commitdiff
Fix bug 44898 - Correctly handle short last blocks in POIFS
authorNick Burch <nick@apache.org>
Tue, 20 May 2008 15:42:16 +0000 (15:42 +0000)
committerNick Burch <nick@apache.org>
Tue, 20 May 2008 15:42:16 +0000 (15:42 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@658285 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/poifs/storage/RawDataBlock.java
src/java/org/apache/poi/poifs/storage/RawDataBlockList.java
src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java

index 3385827124fc492b9b920e711292af4250e8e4bb..b9ed583d5f9c2882925b76c0f2c8509bd2c4a050 100644 (file)
@@ -37,7 +37,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.1-final" date="2008-06-??">
-          <action dev="POI-DEVELOPERS" type="add"><!-- to keep XML validator quiet  --></action>
+           <action dev="POI-DEVELOPERS" type="fix">44898 - Correctly handle short last blocks in POIFS</action>
         </release>  
         <release version="3.1-beta2" date="2008-05-26">
            <action dev="POI-DEVELOPERS" type="fix">44306 - fixed reading/writing of AttrPtg(type=choose) and method toFormulaString() for CHOOSE formulas</action>
index 7cd3c2a7a15dfb0c0537e7727116d90346765a37..aea0a9f1abb477f4f55197269f9b8135903d9cc2 100644 (file)
@@ -34,6 +34,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.1-final" date="2008-06-??">
+           <action dev="POI-DEVELOPERS" type="fix">44898 - Correctly handle short last blocks in POIFS</action>
         </release>  
         <release version="3.1-beta2" date="2008-05-26">
            <action dev="POI-DEVELOPERS" type="fix">44306 - fixed reading/writing of AttrPtg(type=choose) and method toFormulaString() for CHOOSE formulas</action>
index b4630a78b400ef9e46f5a57533102c1713cd0468..5ca1781d072c12a5fc22b615e1ef379f8466959f 100644 (file)
@@ -37,6 +37,7 @@ public class RawDataBlock
 {
     private byte[]  _data;
     private boolean _eof;
+    private boolean _hasData;
     private static POILogger log = POILogFactory.getLogger(RawDataBlock.class);
 
     /**
@@ -66,6 +67,7 @@ public class RawDataBlock
                throws IOException {
         _data = new byte[ blockSize ];
         int count = IOUtils.readFully(stream, _data);
+        _hasData = (count > 0);
 
         if (count == -1) {
             _eof = true;
@@ -94,16 +96,21 @@ public class RawDataBlock
     /**
      * When we read the data, did we hit end of file?
      *
-     * @return true if no data was read because we were at the end of
-     *         the file, else false
-     *
-     * @exception IOException
+     * @return true if the EoF was hit during this block, or
+     *  false if not. If you have a dodgy short last block, then
+     *  it's possible to both have data, and also hit EoF...
      */
-    public boolean eof()
-        throws IOException
-    {
+    public boolean eof() {
         return _eof;
     }
+    /**
+     * Did we actually find any data to read? It's possible,
+     *  in the event of a short last block, to both have hit
+     *  the EoF, but also to have data
+     */
+    public boolean hasData() {
+       return _hasData;
+    }
 
     /* ********** START implementation of ListManagedBlock ********** */
 
@@ -117,7 +124,7 @@ public class RawDataBlock
     public byte [] getData()
         throws IOException
     {
-        if (eof())
+        if (! hasData())
         {
             throw new IOException("Cannot return empty data");
         }
index 76ab219562007e692fee01b6b39f5553b6c11ee7..66eb237a8e92916509c2db61fe4f10243c73ba11 100644 (file)
@@ -51,12 +51,16 @@ public class RawDataBlockList
         while (true)
         {
             RawDataBlock block = new RawDataBlock(stream, bigBlockSize);
+            
+            // If there was data, add the block to the list
+            if(block.hasData()) {
+               blocks.add(block);
+            }
 
-            if (block.eof())
-            {
+            // If the stream is now at the End Of File, we're done
+            if (block.eof()) {
                 break;
             }
-            blocks.add(block);
         }
         setBlocks(( RawDataBlock [] ) blocks.toArray(new RawDataBlock[ 0 ]));
     }
index 1cde86918b9623a6105ff51ff1f187d69b96bc6a..4a948ba8c60d9e15d380fefd3eed14ddec5727ad 100755 (executable)
@@ -130,7 +130,7 @@ public final class TestPOIFSFileSystem extends TestCase {
         * The other is to fix the handling of the last block in
         *  POIFS, since it seems to be slight wrong
         */
-       public void DISABLEDtestShortLastBlock() throws Exception {
+       public void testShortLastBlock() throws Exception {
                String[] files = new String[] {
                        "ShortLastBlock.qwp", "ShortLastBlock.wps"      
                };