mirror of https://github.com/apache/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
This commit is contained in:
parent
faa8575923
commit
5b42301a45
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
|
@ -47,15 +47,16 @@ 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) {
|
||||
|
@ -64,9 +65,6 @@ public final class TestSSTRecord extends TestCase {
|
|||
baos.write(HexRead.readFromString(line));
|
||||
}
|
||||
is.close();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
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());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue