]> source.dussan.org Git - poi.git/commitdiff
Fix bug #46904, for old biff5/biff7 files where the block chain is terminated incorrectly
authorNick Burch <nick@apache.org>
Tue, 24 Mar 2009 16:07:49 +0000 (16:07 +0000)
committerNick Burch <nick@apache.org>
Tue, 24 Mar 2009 16:07:49 +0000 (16:07 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@757873 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/OldExcelFormatException.java [new file with mode: 0644]
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/java/org/apache/poi/poifs/storage/BlockAllocationTableReader.java
src/java/org/apache/poi/poifs/storage/BlockListImpl.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java

index 0cb62592cb99b99c55e50e91ddede73f8d40fca6..577e2c1d1258bbec8e54d453fd937ba31417a411 100644 (file)
@@ -37,6 +37,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.5-beta6" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">46904 - Fix POIFS issue with duplicate block 0 references on very old BIFF5/BIFF7 files</action>
            <action dev="POI-DEVELOPERS" type="fix">46840 - PageSettingsBlock should include HEADERFOOTER record</action>
            <action dev="POI-DEVELOPERS" type="fix">46885 - update cell type when setting cached formula result in XSSFCell</action>
            <action dev="POI-DEVELOPERS" type="add">added modifiers for anchor type to XSSFClientAnchor</action>
index bef81975faf37129ba4ab72feaa3982af04139f1..af309e998fbf270e1987b9dd3f2adf813af92fe8 100644 (file)
@@ -34,6 +34,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.5-beta6" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">46904 - Fix POIFS issue with duplicate block 0 references on very old BIFF5/BIFF7 files</action>
            <action dev="POI-DEVELOPERS" type="fix">46840 - PageSettingsBlock should include HEADERFOOTER record</action>
            <action dev="POI-DEVELOPERS" type="fix">46885 - update cell type when setting cached formula result in XSSFCell</action>
            <action dev="POI-DEVELOPERS" type="add">added modifiers for anchor type to XSSFClientAnchor</action>
diff --git a/src/java/org/apache/poi/hssf/OldExcelFormatException.java b/src/java/org/apache/poi/hssf/OldExcelFormatException.java
new file mode 100644 (file)
index 0000000..5b8e5e4
--- /dev/null
@@ -0,0 +1,23 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.hssf;
+
+public class OldExcelFormatException extends IllegalArgumentException {
+       public OldExcelFormatException(String s) {
+               super(s);
+       }
+}
\ No newline at end of file
index 3f6d525edcb4517b30f537e7ea21ef57195e12ef..1964417366c998f9eed1c4084f39708b3d1ba6c5 100644 (file)
@@ -34,6 +34,7 @@ import org.apache.poi.ddf.EscherBSERecord;
 import org.apache.poi.ddf.EscherBitmapBlip;
 import org.apache.poi.ddf.EscherBlipRecord;
 import org.apache.poi.ddf.EscherRecord;
+import org.apache.poi.hssf.OldExcelFormatException;
 import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.model.RecordStream;
 import org.apache.poi.hssf.model.Sheet;
@@ -227,7 +228,7 @@ public class HSSFWorkbook extends POIDocument implements org.apache.poi.ss.userm
         // check for previous version of file format
         try {
             directory.getEntry("Book");
-            throw new IllegalArgumentException("The supplied spreadsheet seems to be Excel 5.0/7.0 (BIFF5) format. "
+            throw new OldExcelFormatException("The supplied spreadsheet seems to be Excel 5.0/7.0 (BIFF5) format. "
                     + "POI only supports BIFF8 format (from Excel versions 97/2000/XP/2003)");
         } catch (FileNotFoundException e) {
             // fall through
index 1016db9c46341833dc33fd67d1afab564def4d76..19873c08fd59bc5a71839683a9b6ce151c6634d2 100644 (file)
@@ -200,6 +200,10 @@ public class BlockAllocationTableReader
                                // Special case where things are in the wrong order
                                System.err.println("Warning, header block comes after data blocks in POIFS block listing");
                                currentBlock = POIFSConstants.END_OF_CHAIN;
+                       } else if(currentBlock == 0) {
+                               // Special case where the termination isn't done right
+                               System.err.println("Warning, incorrectly terminated data blocks in POIFS block listing (should end at -2, ended at 0)");
+                               currentBlock = POIFSConstants.END_OF_CHAIN;
                        } else {
                                // Ripple up
                                throw e;
index f315b5d515c0291a451886aae713b23bcda10279..a5472d35305b605ffc0fa831e2d466b8a040b946 100644 (file)
@@ -72,6 +72,14 @@ class BlockListImpl
             _blocks[ index ] = null;
         }
     }
+    
+    /**
+     * Unit testing method. Gets, without sanity checks or
+     *  removing.
+     */
+    protected ListManagedBlock get(final int index) throws IOException {
+       return _blocks[index];
+    }
 
     /**
      * remove and return the specified block from the list
index 4130c15970a8cb8f30e7c8165ee2f9e5aeff5459..af1ec26aa03be9ac9c2d0035fc8fb4cb8301c1fa 100644 (file)
@@ -25,6 +25,7 @@ import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.OldExcelFormatException;
 import org.apache.poi.hssf.model.Workbook;
 import org.apache.poi.hssf.record.CellValueRecordInterface;
 import org.apache.poi.hssf.record.EmbeddedObjectRefSubRecord;
@@ -1669,8 +1670,16 @@ public final class TestBugs extends TestCase {
     
     /**
      * java.io.IOException: block[ 0 ] already removed
+     * (is an excel 95 file though)
      */
-    public void BROKENtest46904() throws IOException {
-        HSSFWorkbook wb = openSample("46904.xls");
+    public void test46904() throws IOException {
+       try {
+               HSSFWorkbook wb = openSample("46904.xls");
+               fail();
+       } catch(OldExcelFormatException e) {
+               assertTrue(e.getMessage().startsWith(
+                               "The supplied spreadsheet seems to be Excel"
+               ));
+       }
     }
 }