From e7615fdd348c7b8de6c47459d1f59f19fa6a03db Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Fri, 13 Feb 2015 19:14:14 +0000 Subject: [PATCH] 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 --- .../org/apache/poi/hssf/record/SSTRecord.java | 7 ++++ .../apache/poi/hssf/record/TestSSTRecord.java | 39 +++++++++++------- .../apache/poi/hssf/usermodel/TestBugs.java | 6 +++ test-data/spreadsheet/57456.xls | Bin 0 -> 66048 bytes 4 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 test-data/spreadsheet/57456.xls diff --git a/src/java/org/apache/poi/hssf/record/SSTRecord.java b/src/java/org/apache/poi/hssf/record/SSTRecord.java index aadd58619..abbf90968 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 c33690d83..30b9aff17 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 015c8c595..873647805 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 0000000000000000000000000000000000000000..86fde8587e553add9aa75f7c063503f52fc14744 GIT binary patch literal 66048 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 literal 0 HcmV?d00001