aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahooinc.com>2023-05-09 15:46:32 +0200
committerBjørn Christian Seime <bjorncs@yahooinc.com>2023-05-09 15:59:59 +0200
commitad7aed9bb7b529cc98acf46763cd869523296fbc (patch)
tree1025fa907e90eefd7587b81f90ad6fbb575dc8c6
parent9904aaf25710c6affca4140c22fa99501eb325fd (diff)
Disable string length restriction introduced in Jackson 2.15
Disable restriction only for parsers/generators which is likely to handle literals exceeding 5M
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/JacksonJsonMapper.java12
-rw-r--r--container-search/src/main/java/com/yahoo/search/handler/Json2SingleLevelMap.java16
-rw-r--r--container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java8
-rw-r--r--document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java6
-rw-r--r--document/src/main/java/com/yahoo/document/json/JsonFeedReader.java6
-rw-r--r--document/src/main/java/com/yahoo/document/json/JsonWriter.java7
-rw-r--r--vespa-feed-client-api/src/main/java/ai/vespa/feed/client/JsonFeeder.java6
-rw-r--r--vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/HttpFeedClient.java10
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java6
9 files changed, 63 insertions, 14 deletions
diff --git a/container-core/src/main/java/com/yahoo/restapi/JacksonJsonMapper.java b/container-core/src/main/java/com/yahoo/restapi/JacksonJsonMapper.java
index 6ed9bead0ba..e23401aa882 100644
--- a/container-core/src/main/java/com/yahoo/restapi/JacksonJsonMapper.java
+++ b/container-core/src/main/java/com/yahoo/restapi/JacksonJsonMapper.java
@@ -1,6 +1,9 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.restapi;
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonFactoryBuilder;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
@@ -13,10 +16,17 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
*/
class JacksonJsonMapper {
- static final ObjectMapper instance = new ObjectMapper()
+ static final ObjectMapper instance = new ObjectMapper(createFactory())
.registerModule(new JavaTimeModule())
.registerModule(new Jdk8Module())
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
private JacksonJsonMapper() {}
+
+ private static JsonFactory createFactory() {
+ return new JsonFactoryBuilder()
+ .streamReadConstraints(StreamReadConstraints.builder().maxStringLength(Integer.MAX_VALUE).build())
+ .build();
+
+ }
}
diff --git a/container-search/src/main/java/com/yahoo/search/handler/Json2SingleLevelMap.java b/container-search/src/main/java/com/yahoo/search/handler/Json2SingleLevelMap.java
index 7dd1772a53e..c931c6a356f 100644
--- a/container-search/src/main/java/com/yahoo/search/handler/Json2SingleLevelMap.java
+++ b/container-search/src/main/java/com/yahoo/search/handler/Json2SingleLevelMap.java
@@ -1,9 +1,12 @@
package com.yahoo.search.handler;
+import com.fasterxml.jackson.core.JsonFactoryBuilder;
import com.fasterxml.jackson.core.JsonLocation;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.core.StreamReadConstraints;
+import com.fasterxml.jackson.core.json.JsonReadFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yahoo.processing.IllegalInputException;
@@ -23,10 +26,11 @@ import java.util.Map;
*/
class Json2SingleLevelMap {
- private static final ObjectMapper jsonMapper = new ObjectMapper().configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
+ private static final ObjectMapper jsonMapper = createMapper();
+
private final byte [] buf;
- private final JsonParser parser;
+ private final JsonParser parser;
Json2SingleLevelMap(InputStream data) {
try {
buf = data.readAllBytes();
@@ -36,6 +40,14 @@ class Json2SingleLevelMap {
}
}
+ private static ObjectMapper createMapper() {
+ var jsonFactory = new JsonFactoryBuilder()
+ .streamReadConstraints(StreamReadConstraints.builder().maxStringLength(Integer.MAX_VALUE).build())
+ .configure(JsonReadFeature.ALLOW_SINGLE_QUOTES, true)
+ .build();
+ return new ObjectMapper(jsonFactory);
+ }
+
Map<String, String> parse() {
try {
Map<String, String> map = new HashMap<>();
diff --git a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
index 90f4e6ae65c..ac3d08b2cda 100644
--- a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
+++ b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
@@ -3,7 +3,9 @@ package com.yahoo.search.rendering;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonFactoryBuilder;
import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Preconditions;
@@ -175,8 +177,10 @@ public class JsonRenderer extends AsynchronousSectionedRenderer<Result> {
}
private static JsonFactory createGeneratorFactory() {
- JsonFactory factory = new JsonFactory();
- factory.setCodec(new ObjectMapper().disable(FLUSH_AFTER_WRITE_VALUE));
+ var factory = new JsonFactoryBuilder()
+ .streamReadConstraints(StreamReadConstraints.builder().maxStringLength(Integer.MAX_VALUE).build())
+ .build();
+ factory.setCodec(new ObjectMapper(factory).disable(FLUSH_AFTER_WRITE_VALUE));
return factory;
}
diff --git a/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java b/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java
index 8b44910e75c..30d4176250c 100644
--- a/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java
+++ b/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java
@@ -2,7 +2,9 @@
package com.yahoo.document.json;
import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonFactoryBuilder;
import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import com.yahoo.document.DataType;
import com.yahoo.document.Document;
import com.yahoo.document.DocumentUpdate;
@@ -67,7 +69,9 @@ import static com.yahoo.document.json.JsonSerializationHelper.*;
*/
public class DocumentUpdateJsonSerializer {
- private final JsonFactory jsonFactory = new JsonFactory();
+ private static final JsonFactory jsonFactory = new JsonFactoryBuilder()
+ .streamReadConstraints(StreamReadConstraints.builder().maxStringLength(Integer.MAX_VALUE).build())
+ .build();
private final JsonDocumentUpdateWriter writer = new JsonDocumentUpdateWriter();
private JsonGenerator generator;
diff --git a/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java b/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java
index 6a75e35ebe5..740fc612524 100644
--- a/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java
+++ b/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java
@@ -3,6 +3,7 @@ package com.yahoo.document.json;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonFactoryBuilder;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import com.yahoo.document.DocumentOperation;
import com.yahoo.document.DocumentPut;
import com.yahoo.document.DocumentRemove;
@@ -28,7 +29,10 @@ public class JsonFeedReader implements FeedReader {
private final JsonReader reader;
private final InputStream stream;
- private static final JsonFactory jsonFactory = new JsonFactoryBuilder().disable(JsonFactory.Feature.CANONICALIZE_FIELD_NAMES).build();
+ private static final JsonFactory jsonFactory = new JsonFactoryBuilder()
+ .disable(JsonFactory.Feature.CANONICALIZE_FIELD_NAMES)
+ .streamReadConstraints(StreamReadConstraints.builder().maxStringLength(Integer.MAX_VALUE).build())
+ .build();
public JsonFeedReader(InputStream stream, DocumentTypeManager docMan) {
reader = new JsonReader(docMan, stream, jsonFactory);
diff --git a/document/src/main/java/com/yahoo/document/json/JsonWriter.java b/document/src/main/java/com/yahoo/document/json/JsonWriter.java
index 33243ab832c..29d44dad761 100644
--- a/document/src/main/java/com/yahoo/document/json/JsonWriter.java
+++ b/document/src/main/java/com/yahoo/document/json/JsonWriter.java
@@ -2,7 +2,9 @@
package com.yahoo.document.json;
import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonFactoryBuilder;
import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import com.yahoo.document.Document;
import com.yahoo.document.DocumentId;
import com.yahoo.document.DocumentType;
@@ -74,7 +76,10 @@ import static com.yahoo.document.json.document.DocumentParser.REMOVE;
*/
public class JsonWriter implements DocumentWriter {
- private static final JsonFactory jsonFactory = new JsonFactory();
+ private static final JsonFactory jsonFactory = new JsonFactoryBuilder()
+ .streamReadConstraints(StreamReadConstraints.builder().maxStringLength(Integer.MAX_VALUE).build())
+ .build();
+
private final JsonGenerator generator;
private final boolean tensorShortForm;
diff --git a/vespa-feed-client-api/src/main/java/ai/vespa/feed/client/JsonFeeder.java b/vespa-feed-client-api/src/main/java/ai/vespa/feed/client/JsonFeeder.java
index fdbfae53321..bc669a37227 100644
--- a/vespa-feed-client-api/src/main/java/ai/vespa/feed/client/JsonFeeder.java
+++ b/vespa-feed-client-api/src/main/java/ai/vespa/feed/client/JsonFeeder.java
@@ -3,9 +3,11 @@ package ai.vespa.feed.client;
import ai.vespa.feed.client.FeedClient.OperationType;
import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonFactoryBuilder;
import com.fasterxml.jackson.core.JsonLocation;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import java.io.Closeable;
import java.io.IOException;
@@ -193,7 +195,9 @@ public class JsonFeeder implements Closeable {
}
}
- private static final JsonFactory factory = new JsonFactory();
+ private static final JsonFactory factory = new JsonFactoryBuilder()
+ .streamReadConstraints(StreamReadConstraints.builder().maxStringLength(Integer.MAX_VALUE).build())
+ .build();
@Override public void close() throws IOException {
closed = true;
diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/HttpFeedClient.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/HttpFeedClient.java
index cad2da4d242..3f54808a758 100644
--- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/HttpFeedClient.java
+++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/HttpFeedClient.java
@@ -11,14 +11,14 @@ import ai.vespa.feed.client.Result;
import ai.vespa.feed.client.ResultException;
import ai.vespa.feed.client.ResultParseException;
import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonFactoryBuilder;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import java.io.IOException;
-import java.io.UncheckedIOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
@@ -43,7 +43,9 @@ import static java.util.Objects.requireNonNull;
*/
class HttpFeedClient implements FeedClient {
- private static final JsonFactory factory = new JsonFactory();
+ private static final JsonFactory jsonParserFactory = new JsonFactoryBuilder()
+ .streamReadConstraints(StreamReadConstraints.builder().maxStringLength(Integer.MAX_VALUE).build())
+ .build();
private final Map<String, Supplier<String>> requestHeaders;
private final RequestStrategy requestStrategy;
@@ -195,7 +197,7 @@ class HttpFeedClient implements FeedClient {
static MessageAndTrace parse(DocumentId documentId, byte[] json) {
String message = null;
String trace = null;
- try (JsonParser parser = factory.createParser(json)) {
+ try (JsonParser parser = jsonParserFactory.createParser(json)) {
if (parser.nextToken() != JsonToken.START_OBJECT)
throw new ResultParseException(
documentId,
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
index 5d8d4576bad..d3babc682a5 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
@@ -2,7 +2,9 @@
package com.yahoo.document.restapi.resource;
import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonFactoryBuilder;
import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import com.yahoo.cloud.config.ClusterListConfig;
import com.yahoo.component.annotation.Inject;
import com.yahoo.concurrent.DaemonThreadFactory;
@@ -152,7 +154,9 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler {
@Override public void close(CompletionHandler handler) { handler.completed(); }
};
- private static final JsonFactory jsonFactory = new JsonFactory();
+ private static final JsonFactory jsonFactory = new JsonFactoryBuilder()
+ .streamReadConstraints(StreamReadConstraints.builder().maxStringLength(Integer.MAX_VALUE).build())
+ .build();
private static final String CREATE = "create";
private static final String CONDITION = "condition";