Browse Source

Bug 66425: Avoid a ClassCastException found via oss-fuzz

We try to avoid throwing ClassCastException, but it was possible
to trigger one here with a specially crafted input-file

Should fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=61242

Also enhance output of some test-failures and allow an empty exception message

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1911515 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_5_2_4
Dominik Stadler 9 months ago
parent
commit
5efa428ca0

+ 7
- 6
poi-integration/src/test/java/org/apache/poi/stress/TestAllFiles.java View File

@@ -42,6 +42,7 @@ import org.junit.jupiter.api.parallel.ExecutionMode;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.platform.commons.util.StringUtils;
import org.opentest4j.AssertionFailedError;

/**
@@ -251,12 +252,12 @@ public class TestAllFiles {
} else if (exClass != null) {
Exception e = assertThrows((Class<? extends Exception>)exClass, exec, errPrefix + " expected " + exClass);
String actMsg = pathReplace(e.getMessage());
if (NullPointerException.class.isAssignableFrom(exClass)) {
if (actMsg != null) {
assertTrue(actMsg.contains(exMessage), errPrefix + "Message: "+actMsg+" - didn't contain: "+exMessage);
}
} else {
assertNotNull(actMsg, errPrefix);
// verify that message is either null for both or set for both
assertTrue(actMsg != null || StringUtils.isBlank(exMessage),
errPrefix + " for " + exClass + " expected message '" + exMessage + "' but had '" + actMsg + "'");
if (actMsg != null) {
assertTrue(actMsg.contains(exMessage),
errPrefix + "Message: " + actMsg + " - didn't contain: " + exMessage);
}

+ 5
- 1
poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java View File

@@ -54,7 +54,11 @@ public class HSSFShapeGroup extends HSSFShape implements HSSFShapeContainer {

// read internal and external coordinates from spgrContainer
EscherContainerRecord spContainer = spgrContainer.getChildContainers().get(0);
_spgrRecord = (EscherSpgrRecord) spContainer.getChild(0);
final EscherRecord child = spContainer.getChild(0);
if (!(child instanceof EscherSpgrRecord)) {
throw new IllegalArgumentException("Had unexpected type of child at index 0: " + child.getClass());
}
_spgrRecord = (EscherSpgrRecord) child;
for (EscherRecord ch : spContainer) {
switch (EscherRecordTypes.forTypeID(ch.getRecordId())) {
case CLIENT_ANCHOR:

+ 2
- 2
poi/src/test/java/org/apache/poi/hssf/dev/BaseTestIteratingXLS.java View File

@@ -102,9 +102,9 @@ public abstract class BaseTestIteratingXLS {

Executable ex = () -> runOneFile(file);
if (t == null) {
assertDoesNotThrow(ex);
assertDoesNotThrow(ex, "Failing file: " + file);
} else {
assertThrows(t, ex);
assertThrows(t, ex, "Failing file: " + file);
}
}


+ 1
- 0
poi/src/test/java/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java View File

@@ -54,6 +54,7 @@ class TestBiffDrawingToXml extends BaseTestIteratingXLS {
excludes.put("43493.xls", RecordInputStream.LeftoverDataException.class);
excludes.put("44958_1.xls", RecordInputStream.LeftoverDataException.class);
excludes.put("protected_66115.xls", EncryptedDocumentException.class);
excludes.put("clusterfuzz-testcase-minimized-POIHSSFFuzzer-5285517825277952.xls", IllegalArgumentException.class);
return excludes;
}


+ 3
- 1
poi/src/test/java/org/apache/poi/hssf/model/TestDrawingAggregate.java View File

@@ -136,7 +136,9 @@ class TestDrawingAggregate {

File[] files = testData.listFiles((dir, name) -> name.endsWith(".xls"));
assertNotNull(files, "Need to find files in test-data path, had path: " + testData);
return Stream.of(files).map(Arguments::of);
return Stream.of(files).
filter(file -> !file.getName().equals("clusterfuzz-testcase-minimized-POIHSSFFuzzer-5285517825277952.xls")).
map(Arguments::of);
}

/**

BIN
test-data/spreadsheet/clusterfuzz-testcase-minimized-POIHSSFFuzzer-5285517825277952.xls View File


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


Loading…
Cancel
Save