]> source.dussan.org Git - poi.git/commitdiff
Bug 57456: Fix reading XLS with empty SSTRecord where Excel puts some random number...
authorDominik Stadler <centic@apache.org>
Fri, 13 Feb 2015 19:14:14 +0000 (19:14 +0000)
committerDominik Stadler <centic@apache.org>
Fri, 13 Feb 2015 19:14:14 +0000 (19:14 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1659650 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/record/SSTRecord.java
src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
test-data/spreadsheet/57456.xls [new file with mode: 0644]

index aadd58619b3263d978db7bf4684f5c3a150e8ed8..abbf909681a3528d1a807ee6f7ba7ff425876e01 100644 (file)
@@ -243,7 +243,14 @@ public final class SSTRecord extends ContinuableRecord {
         field_1_num_strings = in.readInt();
         field_2_num_unique_strings = in.readInt();
         field_3_strings = new IntMapper<UnicodeString>();
+        
         deserializer = new SSTDeserializer(field_3_strings);
+        // Bug 57456: some Excel Sheets send 0 as field=1, but have some random number in field_2,
+        // we should not try to read the strings in this case.
+        if(field_1_num_strings == 0) {
+            field_2_num_unique_strings = 0;
+            return;
+        }
         deserializer.manufactureStrings( field_2_num_unique_strings, in );
     }
 
index c33690d83b8f5e73b2bfb8e5a78e0530358ad0db..30b9aff17799044da53468b541c21733fae197c5 100644 (file)
@@ -47,26 +47,24 @@ public final class TestSSTRecord extends TestCase {
     /**
      * decodes hexdump files and concatenates the results
      * @param hexDumpFileNames names of sample files in the hssf test data directory
+     * @throws IOException 
      */
-    private static byte[] concatHexDumps(String... hexDumpFileNames) {
+    private static byte[] concatHexDumps(String... hexDumpFileNames) throws IOException {
         int nFiles = hexDumpFileNames.length;
         ByteArrayOutputStream baos = new ByteArrayOutputStream(nFiles * 8228);
         for (int i = 0; i < nFiles; i++) {
             String sampleFileName = hexDumpFileNames[i];
             InputStream is = HSSFTestDataSamples.openSampleFileStream(sampleFileName);
             BufferedReader br = new BufferedReader(new InputStreamReader(is));
-            try {
-                while (true) {
-                    String line = br.readLine();
-                    if (line == null) {
-                        break;
-                    }
-                    baos.write(HexRead.readFromString(line));
+
+            while (true) {
+                String line = br.readLine();
+                if (line == null) {
+                    break;
                 }
-                is.close();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
+                baos.write(HexRead.readFromString(line));
             }
+            is.close();
         }
 
         return baos.toByteArray();
@@ -86,8 +84,9 @@ public final class TestSSTRecord extends TestCase {
 
     /**
      * SST is often split over several {@link ContinueRecord}s
+     * @throws IOException 
      */
-    public void testContinuedRecord() {
+    public void testContinuedRecord() throws IOException {
         byte[] origData;
         SSTRecord record;
         byte[] ser_output;
@@ -288,11 +287,10 @@ public final class TestSSTRecord extends TestCase {
         assertEquals( 2, record.countStrings() );
         assertEquals( 3, record.getNumStrings() );
         assertEquals( 2, record.getNumUniqueStrings() );
-        Iterator iter = record.getStrings();
+        Iterator<UnicodeString> iter = record.getStrings();
 
-        while ( iter.hasNext() )
-        {
-            UnicodeString ucs = (UnicodeString) iter.next();
+        while ( iter.hasNext() ) {
+            UnicodeString ucs = iter.next();
 
             if ( ucs.equals( s1 ) )
             {
@@ -1498,4 +1496,13 @@ public final class TestSSTRecord extends TestCase {
         assertEquals(src, dst);
     }
 
+    public void test57456() {
+        byte[] bytes = HexRead.readFromString("FC, 00, 08, 00, 00, 00, 00, 00, E1, 06, 00, 00");
+        RecordInputStream in = TestcaseRecordInputStream.create(bytes);
+        assertEquals(SSTRecord.sid, in.getSid());
+        SSTRecord src = new SSTRecord(in);
+        assertEquals(0, src.getNumStrings());
+        assertEquals(0, src.getNumUniqueStrings());
+        
+    }
 }
index 015c8c59501c646d55e9819c115c5a4eea81fed7..873647805c6575e67946c4d9f76748b53a82df3e 100644 (file)
@@ -2681,4 +2681,10 @@ public final class TestBugs extends BaseTestBugzillaIssues {
         s = wb.getSheetAt(0);
         assertEquals(refHttp, s.getRow(0).getCell(0).getCellFormula());
     }
+
+    @Test
+    public void test57456() throws IOException {
+        Workbook wb = openSample("57456.xls");
+        wb.close();
+    }
 }
diff --git a/test-data/spreadsheet/57456.xls b/test-data/spreadsheet/57456.xls
new file mode 100644 (file)
index 0000000..86fde85
Binary files /dev/null and b/test-data/spreadsheet/57456.xls differ