From b52dd893e165105d1df37fd6c9fe89b5f01b28f0 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Fri, 1 Mar 2024 20:25:56 -0800 Subject: [PATCH] Fix #4381: add `null` checks for BigIntegerNode, BinaryNode, DecimalNode, TextNode constructors --- release-notes/VERSION | 1 + .../java/tools/jackson/databind/node/BigIntegerNode.java | 5 ++++- src/main/java/tools/jackson/databind/node/BinaryNode.java | 4 +++- src/main/java/tools/jackson/databind/node/DecimalNode.java | 6 +++++- src/main/java/tools/jackson/databind/node/POJONode.java | 5 +---- src/main/java/tools/jackson/databind/node/TextNode.java | 3 ++- src/test/java/tools/jackson/databind/node/TextNodeTest.java | 3 --- 7 files changed, 16 insertions(+), 11 deletions(-) diff --git a/release-notes/VERSION b/release-notes/VERSION index 6fbd343cbe..50ed917e18 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -56,6 +56,7 @@ Versions: 3.x (for earlier see VERSION-2.x) #3542: Rename "com.fasterxml.jackson" -> "tools.jackson" #3601: Change `Optional` deserialization from "absent" value into `null`, from "empty" $4160: Deprecate `DefaultTyping.EVERYTHING` in `2.x` and remove in `3.0` +#4381: Prevent construction of `null`-valued `JsonNode`s (like `TextNode`) - Remove `MappingJsonFactory` - Add context parameter for `TypeSerializer` contextualization (`forProperty()`) - Default for `JsonNodeFeature.STRIP_TRAILING_BIGDECIMAL_ZEROES` changed to `false` for 3.0 diff --git a/src/main/java/tools/jackson/databind/node/BigIntegerNode.java b/src/main/java/tools/jackson/databind/node/BigIntegerNode.java index b2a6a03f84..82ac1b2dbc 100644 --- a/src/main/java/tools/jackson/databind/node/BigIntegerNode.java +++ b/src/main/java/tools/jackson/databind/node/BigIntegerNode.java @@ -28,7 +28,10 @@ public class BigIntegerNode /********************************************************** */ - public BigIntegerNode(BigInteger v) { _value = v; } + public BigIntegerNode(BigInteger v) { + // 01-Mar-2024, tatu: [databind#4381] No null-valued JsonNodes + _value = Objects.requireNonNull(v); + } public static BigIntegerNode valueOf(BigInteger v) { return new BigIntegerNode(v); } diff --git a/src/main/java/tools/jackson/databind/node/BinaryNode.java b/src/main/java/tools/jackson/databind/node/BinaryNode.java index 7e14d8d76d..935bf9020c 100644 --- a/src/main/java/tools/jackson/databind/node/BinaryNode.java +++ b/src/main/java/tools/jackson/databind/node/BinaryNode.java @@ -1,6 +1,7 @@ package tools.jackson.databind.node; import java.util.Arrays; +import java.util.Objects; import tools.jackson.core.*; import tools.jackson.databind.SerializerProvider; @@ -20,7 +21,8 @@ public class BinaryNode public BinaryNode(byte[] data) { - _data = data; + // 01-Mar-2024, tatu: [databind#4381] No null-valued JsonNodes + _data = Objects.requireNonNull(data); } public BinaryNode(byte[] data, int offset, int length) diff --git a/src/main/java/tools/jackson/databind/node/DecimalNode.java b/src/main/java/tools/jackson/databind/node/DecimalNode.java index d8f590a93d..9ae0dd3eae 100644 --- a/src/main/java/tools/jackson/databind/node/DecimalNode.java +++ b/src/main/java/tools/jackson/databind/node/DecimalNode.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Objects; import tools.jackson.core.*; import tools.jackson.databind.*; @@ -30,7 +31,10 @@ public class DecimalNode /********************************************************************** */ - public DecimalNode(BigDecimal v) { _value = v; } + public DecimalNode(BigDecimal v) { + // 01-Mar-2024, tatu: [databind#4381] No null-valued JsonNodes + _value = Objects.requireNonNull(v); + } public static DecimalNode valueOf(BigDecimal d) { return new DecimalNode(d); } diff --git a/src/main/java/tools/jackson/databind/node/POJONode.java b/src/main/java/tools/jackson/databind/node/POJONode.java index 3a73817d75..274edd94ea 100644 --- a/src/main/java/tools/jackson/databind/node/POJONode.java +++ b/src/main/java/tools/jackson/databind/node/POJONode.java @@ -66,7 +66,7 @@ public byte[] binaryValue() @Override public boolean asBoolean(boolean defaultValue) { - if (_value != null && _value instanceof Boolean) { + if (_value instanceof Boolean) { return ((Boolean) _value).booleanValue(); } return defaultValue; @@ -147,9 +147,6 @@ public boolean equals(Object o) return false; } - /** - * @since 2.3 - */ protected boolean _pojoEquals(POJONode other) { if (_value == null) { diff --git a/src/main/java/tools/jackson/databind/node/TextNode.java b/src/main/java/tools/jackson/databind/node/TextNode.java index 5bc65119bc..65bcda35b9 100644 --- a/src/main/java/tools/jackson/databind/node/TextNode.java +++ b/src/main/java/tools/jackson/databind/node/TextNode.java @@ -21,7 +21,8 @@ public class TextNode protected final String _value; public TextNode(String v) { - _value = v; + // 01-Mar-2024, tatu: [databind#4381] No null-valued TextNodes + _value = Objects.requireNonNull(v); } /** diff --git a/src/test/java/tools/jackson/databind/node/TextNodeTest.java b/src/test/java/tools/jackson/databind/node/TextNodeTest.java index f8f8d50b6f..aa2b9800d1 100644 --- a/src/test/java/tools/jackson/databind/node/TextNodeTest.java +++ b/src/test/java/tools/jackson/databind/node/TextNodeTest.java @@ -41,11 +41,8 @@ public void testText() public void testEquals() { - assertEquals(new TextNode(null), new TextNode(null)); assertEquals(new TextNode("abc"), new TextNode("abc")); - assertNotEquals(new TextNode(null), new TextNode("def")); assertNotEquals(new TextNode("abc"), new TextNode("def")); - assertNotEquals(new TextNode("abc"), new TextNode(null)); } public void testHashCode()