From 36cd882098c448c944f44edb10659d5f25d59ece Mon Sep 17 00:00:00 2001 From: Jonas Konrad Date: Tue, 21 Feb 2023 04:50:33 +0100 Subject: [PATCH] Add JsonFactory.Feature to disable charset detection (#921) --- .../com/fasterxml/jackson/core/JsonFactory.java | 12 +++++++++++- .../core/json/ByteSourceJsonBootstrapper.java | 2 +- .../jackson/core/read/SimpleParserTest.java | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/JsonFactory.java b/src/main/java/com/fasterxml/jackson/core/JsonFactory.java index a558dd78d3..8e7a961db9 100644 --- a/src/main/java/com/fasterxml/jackson/core/JsonFactory.java +++ b/src/main/java/com/fasterxml/jackson/core/JsonFactory.java @@ -122,7 +122,17 @@ public enum Feature * * @since 2.6 */ - USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING(true) + USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING(true), + + /** + * Feature to control charset detection for byte-based inputs ({@code byte[]}, {@link InputStream}...). When + * this feature is enabled (the default), the factory will allow UTF-16 and UTF-32 inputs and try to detect + * them, as specified by RFC 4627. When this feature is disabled the factory will assume UTF-8, as specified + * by RFC 8259. + * + * @since 2.15 + */ + CHARSET_DETECTION(true), ; diff --git a/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java b/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java index bba1245bb2..b2b9d088bf 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java +++ b/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java @@ -253,7 +253,7 @@ public JsonParser constructParser(int parserFeatures, ObjectCodec codec, int factoryFeatures) throws IOException { int prevInputPtr = _inputPtr; - JsonEncoding enc = detectEncoding(); + JsonEncoding enc = JsonFactory.Feature.CHARSET_DETECTION.enabledIn(factoryFeatures) ? detectEncoding() : JsonEncoding.UTF8; int bytesProcessed = _inputPtr - prevInputPtr; if (enc == JsonEncoding.UTF8) { diff --git a/src/test/java/com/fasterxml/jackson/core/read/SimpleParserTest.java b/src/test/java/com/fasterxml/jackson/core/read/SimpleParserTest.java index 5e49babf35..3f2571b5cf 100644 --- a/src/test/java/com/fasterxml/jackson/core/read/SimpleParserTest.java +++ b/src/test/java/com/fasterxml/jackson/core/read/SimpleParserTest.java @@ -1,6 +1,7 @@ package com.fasterxml.jackson.core.read; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.json.JsonReadFeature; import com.fasterxml.jackson.core.testsupport.MockDataInput; import com.fasterxml.jackson.core.util.JsonParserDelegate; @@ -703,6 +704,20 @@ private void _testHandlingOfInvalidSpaceFromResource(boolean useStream) throws E p.close(); } + public void testInvalidUtf8ValidUtf16() throws IOException { + JsonFactory factory = new JsonFactoryBuilder() + .disable(JsonFactory.Feature.CHARSET_DETECTION) + .build(); + JsonParser parser = factory.createParser(new byte[]{0x22, 0x00, 0x22, 0x5b, 0x22, 0x00}); + try { + //noinspection StatementWithEmptyBody + while (parser.nextToken() != null) {} + fail("Should have failed"); + } catch (JsonParseException e) { + verifyException(e, "unquoted character"); + } + } + /* /********************************************************** /* Helper methods