fixed re-open of bug #42844. HSSFEventFactory silently skips unknown records that happen to be continued.
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@575406 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b65d864b2c
commit
edf5dc307b
@ -22,15 +22,7 @@ import java.io.InputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.poi.hssf.eventusermodel.HSSFUserException;
|
import org.apache.poi.hssf.eventusermodel.HSSFUserException;
|
||||||
import org.apache.poi.hssf.record.RecordFormatException;
|
import org.apache.poi.hssf.record.*;
|
||||||
import org.apache.poi.hssf.record.Record;
|
|
||||||
import org.apache.poi.hssf.record.RecordInputStream;
|
|
||||||
import org.apache.poi.hssf.record.RecordFactory;
|
|
||||||
import org.apache.poi.hssf.record.ContinueRecord;
|
|
||||||
import org.apache.poi.hssf.record.DrawingRecord;
|
|
||||||
import org.apache.poi.hssf.record.DrawingGroupRecord;
|
|
||||||
import org.apache.poi.hssf.record.ObjRecord;
|
|
||||||
import org.apache.poi.hssf.record.TextObjectRecord;
|
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -151,7 +143,7 @@ public class HSSFEventFactory
|
|||||||
{
|
{
|
||||||
in.nextRecord();
|
in.nextRecord();
|
||||||
sid = in.getSid();;
|
sid = in.getSid();;
|
||||||
|
|
||||||
//
|
//
|
||||||
// for some reasons we have to make the workbook to be at least 4096 bytes
|
// for some reasons we have to make the workbook to be at least 4096 bytes
|
||||||
// but if we have such workbook we fill the end of it with zeros (many zeros)
|
// but if we have such workbook we fill the end of it with zeros (many zeros)
|
||||||
@ -215,7 +207,11 @@ public class HSSFEventFactory
|
|||||||
rec = lastRec;
|
rec = lastRec;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new RecordFormatException("Records should handle ContinueRecord internally. Should not see this exception");
|
if (rec instanceof UnknownRecord) {
|
||||||
|
;//silently skip records we don't know about
|
||||||
|
} else {
|
||||||
|
throw new RecordFormatException("Records should handle ContinueRecord internally. Should not see this exception");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BIN
src/testcases/org/apache/poi/hssf/data/42844.xls
Normal file
BIN
src/testcases/org/apache/poi/hssf/data/42844.xls
Normal file
Binary file not shown.
@ -76,6 +76,24 @@ public class TestHSSFEventFactory extends TestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unknown records can be continued.
|
||||||
|
* Check that HSSFEventFactory doesn't break on them.
|
||||||
|
* (the test file was provided in a reopen of bug #42844)
|
||||||
|
*/
|
||||||
|
public void testUnknownContinueRecords() throws Exception {
|
||||||
|
File f = new File(dirname + "/42844.xls");
|
||||||
|
|
||||||
|
HSSFRequest req = new HSSFRequest();
|
||||||
|
MockHSSFListener mockListen = new MockHSSFListener();
|
||||||
|
req.addListenerForAllRecords(mockListen);
|
||||||
|
|
||||||
|
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(f));
|
||||||
|
HSSFEventFactory factory = new HSSFEventFactory();
|
||||||
|
factory.processWorkbookEvents(req, fs);
|
||||||
|
|
||||||
|
assertTrue("no errors while processing the file", true);
|
||||||
|
}
|
||||||
|
|
||||||
private static class MockHSSFListener implements HSSFListener {
|
private static class MockHSSFListener implements HSSFListener {
|
||||||
private MockHSSFListener() {}
|
private MockHSSFListener() {}
|
||||||
|
Loading…
Reference in New Issue
Block a user