Browse Source

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
tags/REL_3_12_BETA1
Dominik Stadler 9 years ago
parent
commit
5b42301a45

+ 7
- 0
src/java/org/apache/poi/hssf/record/SSTRecord.java View 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 );
}


+ 23
- 16
src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java View 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());
}
}

+ 6
- 0
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java View 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();
}
}

BIN
test-data/spreadsheet/57456.xls View File


Loading…
Cancel
Save