From 073443b860908662b78e06045822ab8fa9a92315 Mon Sep 17 00:00:00 2001 From: Sahana Bogar Date: Tue, 18 Aug 2026 18:33:18 +0530 Subject: [PATCH] return null from nextStringValue() at end of input --- .../dataformat/xml/deser/FromXmlParser.java | 1 + .../xml/stream/XmlParserNextXxxTest.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/tools/jackson/dataformat/xml/deser/FromXmlParser.java b/src/main/java/tools/jackson/dataformat/xml/deser/FromXmlParser.java index a87bc8086..2d8fb94b1 100644 --- a/src/main/java/tools/jackson/dataformat/xml/deser/FromXmlParser.java +++ b/src/main/java/tools/jackson/dataformat/xml/deser/FromXmlParser.java @@ -996,6 +996,7 @@ public String nextStringValue() throws JacksonException break; case XmlTokenStream.XML_END: _updateTokenToNull(); + break; default: return _internalErrorUnknownToken(token); } diff --git a/src/test/java/tools/jackson/dataformat/xml/stream/XmlParserNextXxxTest.java b/src/test/java/tools/jackson/dataformat/xml/stream/XmlParserNextXxxTest.java index 6da2cd57c..8c9002742 100644 --- a/src/test/java/tools/jackson/dataformat/xml/stream/XmlParserNextXxxTest.java +++ b/src/test/java/tools/jackson/dataformat/xml/stream/XmlParserNextXxxTest.java @@ -7,6 +7,7 @@ import tools.jackson.dataformat.xml.deser.FromXmlParser; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class XmlParserNextXxxTest extends XmlTestUtil { @@ -43,4 +44,26 @@ public void testXmlAttributesWithNextTextValue() throws Exception assertToken(JsonToken.END_OBJECT, xp.nextToken()); // xp.close(); } + + // nextStringValue() must honor the JsonParser contract at end of input: + // return null, same as nextToken() does, instead of leaking an unchecked + // IllegalStateException from the internal XML_END branch. + @Test + public void testNextStringValueAtEndOfInput() throws Exception + { + final String XML = ""; + + JsonParser xp = xmlMapper(false).createParser(XML); + + assertToken(JsonToken.START_OBJECT, xp.nextToken()); // + assertToken(JsonToken.PROPERTY_NAME, xp.nextToken()); // max + assertEquals("7", xp.nextStringValue()); + assertToken(JsonToken.PROPERTY_NAME, xp.nextToken()); // offset + assertEquals("9", xp.nextStringValue()); + assertToken(JsonToken.END_OBJECT, xp.nextToken()); // + + // One more call past the end: should quietly report end-of-input + assertNull(xp.nextStringValue()); + xp.close(); + } }