Fuzz34435ParseTest.java
package com.fasterxml.jackson.core.fuzz;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.exc.StreamReadException;
import com.fasterxml.jackson.core.json.JsonReadFeature;
import static org.junit.jupiter.api.Assertions.fail;
// Trying to repro: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=34435
class Fuzz34435ParseTest extends JUnit5TestBase
{
private final byte[] DOC = readResource("/data/fuzz-json-34435.json");
@Test
void fuzz34435ViaParser() throws Exception
{
final JsonFactory f = JsonFactory.builder()
// NOTE: test set up enables a few non-standard features
.enable(JsonReadFeature.ALLOW_JAVA_COMMENTS)
.enable(JsonReadFeature.ALLOW_YAML_COMMENTS)
.enable(JsonReadFeature.ALLOW_SINGLE_QUOTES)
.enable(JsonReadFeature.ALLOW_UNQUOTED_FIELD_NAMES)
.streamReadConstraints(StreamReadConstraints.builder().maxNestingDepth(Integer.MAX_VALUE).build())
.build();
JsonParser p = f.createParser(/*ObjectReadContext.empty(), */ DOC);
// Long doc so only check a few initial entries first:
for (int i = 0; i < 10; ++i) {
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
}
// Beyond that, simply read through to catch expected issue
try {
while (p.nextToken() != null) {
// but force decoding of Strings
switch (p.currentToken()) {
case FIELD_NAME:
p.currentName();
break;
case VALUE_STRING:
p.getText();
break;
default:
}
}
fail("Should not pass");
} catch (StreamReadException e) {
verifyException(e, "Unexpected character");
verifyException(e, "colon to separate");
}
p.close();
}
}