From 3a4368471da39a9eb2e8213216e99ffb3efaf7d8 Mon Sep 17 00:00:00 2001 From: uttam12331 Date: Tue, 4 Aug 2026 11:07:15 +0530 Subject: [PATCH] Pass normalized separator in withArrayElementSeparator to avoid null state `CsvSchema.withArrayElementSeparator(String)` normalizes a null argument to "" in the local `sep` and uses it for the equality check, but then passes the raw `separator` to the copy constructor, so `withArrayElementSeparator(null)` leaves `_arrayElementSeparator` null. `hasArrayElementSeparator()` then NPEs on `!_arrayElementSeparator.isEmpty()`, as does a later `withArrayElementSeparator` on `_arrayElementSeparator.equals(sep)`. Pass the already-normalized `sep`, add a regression test, and add release notes. --- .../jackson/dataformat/csv/CsvSchema.java | 2 +- .../dataformat/csv/schema/CsvSchemaTest.java | 17 +++++++++++++++++ release-notes/CREDITS-2.x | 6 ++++++ release-notes/VERSION-2.x | 3 +++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java index 0df3b8de4..d2a640622 100644 --- a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java +++ b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java @@ -1206,7 +1206,7 @@ public CsvSchema withoutEscapeChar() { public CsvSchema withArrayElementSeparator(String separator) { String sep = separator == null ? "" : separator; return (_arrayElementSeparator.equals(sep)) ? this : new CsvSchema(_columns, _features, - _columnSeparator, _quoteChar, _escapeChar, _lineSeparator, separator, + _columnSeparator, _quoteChar, _escapeChar, _lineSeparator, sep, _nullValue, _columnsByName, _anyPropertyName); } diff --git a/csv/src/test/java/com/fasterxml/jackson/dataformat/csv/schema/CsvSchemaTest.java b/csv/src/test/java/com/fasterxml/jackson/dataformat/csv/schema/CsvSchemaTest.java index ba16d5a8d..be77350a7 100644 --- a/csv/src/test/java/com/fasterxml/jackson/dataformat/csv/schema/CsvSchemaTest.java +++ b/csv/src/test/java/com/fasterxml/jackson/dataformat/csv/schema/CsvSchemaTest.java @@ -253,4 +253,21 @@ public void testSchemaWithExplicitIndices() _verifyLinks(pointSchema); } + + // [dataformats-text#710]: withArrayElementSeparator(null) should normalize + // to "no separator" (like the local `sep` used for the equality check), not + // store a null that later NPEs in hasArrayElementSeparator() + @Test + public void testWithArrayElementSeparatorNull() + { + CsvSchema schema = CsvSchema.emptySchema().withArrayElementSeparator(";"); + assertTrue(schema.hasArrayElementSeparator()); + + CsvSchema cleared = schema.withArrayElementSeparator(null); + assertFalse(cleared.hasArrayElementSeparator()); + assertEquals("", cleared.getArrayElementSeparator()); + + // and calling it again must not throw + assertFalse(cleared.withArrayElementSeparator(null).hasArrayElementSeparator()); + } } diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index 3a401418d..2dc32b8dc 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -331,3 +331,9 @@ MichaƂ Majchrowicz (@sectroyer) * Reported #707: (yaml) `StackOverflowError` when reading deeply nested merge keys (`<<`) with `YAMLAnchorReplayingFactory` (GHSA-255r-36wv-4qpr) (2.21.6) + +Uttam Limbani (@uttam12331) + +* Fixed #710: (csv) `CsvSchema.withArrayElementSeparator(null)` stores `null`, + causing `NullPointerException` from `hasArrayElementSeparator()` + (2.21.6) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 78f7aa253..78f98ab86 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -16,6 +16,9 @@ Active Maintainers: 2.21.6 (not yet released) +#710: (csv) `CsvSchema.withArrayElementSeparator(null)` stores `null`, causing + `NullPointerException` from `hasArrayElementSeparator()` + (fix by @uttam12331) #701: (yaml) `ALWAYS_QUOTE_NUMBERS_AS_STRINGS` does not quote YAML 1.1 exponent (`1e5`), hex (`0x1F`) and underscore (`12_34`) number forms (reported by @EverNife)