diff --git a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonUtils.java b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonUtils.java index 613eaafc0e98..d4bf14267295 100644 --- a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonUtils.java +++ b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonUtils.java @@ -13,6 +13,7 @@ */ package io.trino.plugin.base.util; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; @@ -81,6 +82,10 @@ public static T jsonTreeToValue(JsonNode treeNode, Class javaType) static T parseJson(byte[] jsonBytes, Class javaType) throws IOException { - return OBJECT_MAPPER.readValue(jsonBytes, javaType); + try (JsonParser parser = OBJECT_MAPPER.createParser(jsonBytes)) { + T value = OBJECT_MAPPER.readValue(parser, javaType); + checkArgument(parser.nextToken() == null, "Found characters after the expected end of input"); + return value; + } } } diff --git a/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/util/TestJsonUtils.java b/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/util/TestJsonUtils.java index e746e288dfbe..d82b6af83cae 100644 --- a/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/util/TestJsonUtils.java +++ b/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/util/TestJsonUtils.java @@ -14,6 +14,7 @@ package io.trino.plugin.base.util; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonParseException; import org.testng.annotations.Test; import java.io.IOException; @@ -22,6 +23,7 @@ import static io.trino.plugin.base.util.TestJsonUtils.TestEnum.OPTION_A; import static java.nio.charset.StandardCharsets.US_ASCII; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class TestJsonUtils { @@ -44,4 +46,17 @@ public void testLowercaseEnum() TestObject parsed = parseJson("{\"testEnum\": \"option_a\"}".getBytes(US_ASCII), TestObject.class); assertThat(parsed.testEnum).isEqualTo(OPTION_A); } + + @Test + public void testTrailingContent() + throws IOException + { + assertThatThrownBy(() -> parseJson("{} {}}".getBytes(US_ASCII), TestObject.class)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Found characters after the expected end of input"); + + assertThatThrownBy(() -> parseJson("{} not even a JSON here".getBytes(US_ASCII), TestObject.class)) + .isInstanceOf(JsonParseException.class) + .hasMessageStartingWith("Unrecognized token 'not': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')"); + } }