From: Dominik Stadler Date: Fri, 13 Feb 2015 19:14:14 +0000 (+0000) Subject: Bug 57456: Fix reading XLS with empty SSTRecord where Excel puts some random number... X-Git-Tag: REL_3_12_BETA1~7 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=5b42301a451bd4c4598b6f85bab7b1e53b72aef4;p=poi.git Bug 57456: Fix reading XLS with empty SSTRecord where Excel puts some random number in unique-strings-count-field git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1659650 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/hssf/record/SSTRecord.java b/src/java/org/apache/poi/hssf/record/SSTRecord.java index aadd58619b..abbf909681 100644 --- a/src/java/org/apache/poi/hssf/record/SSTRecord.java +++ b/src/java/org/apache/poi/hssf/record/SSTRecord.java @@ -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(); + 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 ); } diff --git a/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java b/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java index c33690d83b..30b9aff177 100644 --- a/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java +++ b/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java @@ -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 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()); + + } } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index 015c8c5950..873647805c 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -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 index 0000000000..86fde8587e Binary files /dev/null and b/test-data/spreadsheet/57456.xls differ