#57851 - Skip null properties in PropertyTableBase, which is how PropertyFactory reports unsupported POIFS properties

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1675702 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2015-04-23 18:35:15 +00:00
parent 4a33fe786c
commit ac7b4bc3dd
2 changed files with 30 additions and 5 deletions

View File

@ -111,6 +111,11 @@ public abstract class PropertyTableBase implements BATManaged {
while (!children.empty())
{
Property property = children.pop();
if (property == null)
{
// unknown / unsupported / corrupted property, skip
continue;
}
root.addChild(property);
if (property.isDirectory())

View File

@ -44,15 +44,22 @@ public final class TestFileSystemBugs extends TestCase {
}
openedFSs = null;
}
protected DirectoryNode[] openSample(String name) throws Exception {
POIFSFileSystem ofs = new POIFSFileSystem(
_samples.openResourceAsStream(name));
protected DirectoryNode[] openSample(String name, boolean oldFails) throws Exception {
NPOIFSFileSystem nfs = new NPOIFSFileSystem(
_samples.openResourceAsStream(name));
if (openedFSs == null) openedFSs = new ArrayList<NPOIFSFileSystem>();
openedFSs.add(nfs);
POIFSFileSystem ofs = null;
try {
ofs = new POIFSFileSystem(
_samples.openResourceAsStream(name));
if (oldFails) fail("POIFSFileSystem should have failed but didn't");
} catch (Exception e) {
if (!oldFails) throw e;
}
if (ofs == null) return new DirectoryNode[] { nfs.getRoot() };
return new DirectoryNode[] { ofs.getRoot(), nfs.getRoot() };
}
@ -62,7 +69,7 @@ public final class TestFileSystemBugs extends TestCase {
*/
public void testNotesOLE2Files() throws Exception {
// Check the contents
for (DirectoryNode root : openSample("Notes.ole2")) {
for (DirectoryNode root : openSample("Notes.ole2", false)) {
assertEquals(1, root.getEntryCount());
Entry entry = root.getEntries().next();
@ -87,4 +94,17 @@ public final class TestFileSystemBugs extends TestCase {
assertEquals("\u0001CompObj", entry.getName());
}
}
/**
* Ensure that a file with a corrupted property in the
* properties table can still be loaded, and the remaining
* properties used
* Note - only works for NPOIFSFileSystem, POIFSFileSystem
* can't cope with this level of corruption
*/
public void testCorruptedProperties() throws Exception {
for (DirectoryNode root : openSample("unknown_properties.msg", true)) {
assertEquals(42, root.getEntryCount());
}
}
}