From 053fd092d9a85350cd5210f4738f04b7e8506e84 Mon Sep 17 00:00:00 2001 From: David Schlosnagle Date: Thu, 10 Aug 2023 15:50:06 -0400 Subject: [PATCH 1/3] ByteSourceJsonBootstrapper uses StringReader for < 8KiB byte[] inputs --- .../jackson/core/json/ByteSourceJsonBootstrapper.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 b2b9d088bf..2088b9ad92 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java +++ b/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java @@ -230,6 +230,12 @@ public Reader constructReader() throws IOException InputStream in = _in; if (in == null) { + int length = _inputEnd - _inputPtr; + if (length >= 0 && length <= 8192) { + // [jackson-core#488] Avoid overhead of heap ByteBuffer allocated by InputStreamReader + // when processing small inputs up to 8KiB. + return new StringReader(new String(_inputBuffer, _inputPtr, length, enc.getJavaName())); + } in = new ByteArrayInputStream(_inputBuffer, _inputPtr, _inputEnd); } else { /* Also, if we have any read but unused input (usually true), From f525c86f2fe5cd2634c0df6181966c7fd3040460 Mon Sep 17 00:00:00 2001 From: David Schlosnagle Date: Thu, 10 Aug 2023 22:04:12 -0400 Subject: [PATCH 2/3] Clarify 8KiB byte array length limit --- .../jackson/core/json/ByteSourceJsonBootstrapper.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 2088b9ad92..a87982d68b 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java +++ b/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java @@ -22,6 +22,9 @@ public final class ByteSourceJsonBootstrapper public final static byte UTF8_BOM_2 = (byte) 0xBB; public final static byte UTF8_BOM_3 = (byte) 0xBF; + // [jackson-core#488] Limit in bytes for input byte array length to use StringReader instead of InputStreamReader + private static final int STRING_READER_BYTE_ARRAY_LENGTH_LIMIT = 8192; + /* /********************************************************** /* Configuration @@ -231,7 +234,7 @@ public Reader constructReader() throws IOException if (in == null) { int length = _inputEnd - _inputPtr; - if (length >= 0 && length <= 8192) { + if (length <= STRING_READER_BYTE_ARRAY_LENGTH_LIMIT && length >= 0) { // [jackson-core#488] Avoid overhead of heap ByteBuffer allocated by InputStreamReader // when processing small inputs up to 8KiB. return new StringReader(new String(_inputBuffer, _inputPtr, length, enc.getJavaName())); From a51538207854ab0477b73b645a1a5a690aa8a692 Mon Sep 17 00:00:00 2001 From: David Schlosnagle Date: Fri, 11 Aug 2023 08:11:59 -0400 Subject: [PATCH 3/3] Skip greater than zero check --- .../fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a87982d68b..98072cd758 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java +++ b/src/main/java/com/fasterxml/jackson/core/json/ByteSourceJsonBootstrapper.java @@ -234,7 +234,7 @@ public Reader constructReader() throws IOException if (in == null) { int length = _inputEnd - _inputPtr; - if (length <= STRING_READER_BYTE_ARRAY_LENGTH_LIMIT && length >= 0) { + if (length <= STRING_READER_BYTE_ARRAY_LENGTH_LIMIT) { // [jackson-core#488] Avoid overhead of heap ByteBuffer allocated by InputStreamReader // when processing small inputs up to 8KiB. return new StringReader(new String(_inputBuffer, _inputPtr, length, enc.getJavaName()));