From 5f3c7ca559ac5f7d4d37917d568001579b596f2b Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Mon, 25 Nov 2019 11:40:53 +0100 Subject: [PATCH] Fix NullPointerException in Jackson2SmileDecoder Fix uncommon case in Jackson2SmileDecoder, where a null token, incicating a document separator in streaming mode, is followed by NOT_AVAILABLE. Closes gh-24009 --- .../http/codec/json/Jackson2Tokenizer.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java index 1846d3e3bf..438ca49f79 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java @@ -122,13 +122,18 @@ final class Jackson2Tokenizer { private List parseTokenBufferFlux() throws IOException { List result = new ArrayList<>(); - while (true) { + // SPR-16151: Smile data format uses null to separate documents + boolean previousNull = false; + while (!this.parser.isClosed()) { JsonToken token = this.parser.nextToken(); - // SPR-16151: Smile data format uses null to separate documents if (token == JsonToken.NOT_AVAILABLE || - (token == null && (token = this.parser.nextToken()) == null)) { + token == null && previousNull) { break; } + else if (token == null ) { // !previousNull + previousNull = true; + continue; + } updateDepth(token); if (!this.tokenizeArrayElements) { processTokenNormal(token, result); @@ -169,6 +174,9 @@ final class Jackson2Tokenizer { private void processTokenArray(JsonToken token, List result) throws IOException { if (!isTopLevelArrayToken(token)) { + if (!this.parser.hasCurrentToken()) { + System.out.println("NO CURRENT TOKEN: " + token); + } this.tokenBuffer.copyCurrentEvent(this.parser); }