changeset 19688:0869e8023eab

lib: Fixed json-parser to correctly parse numbers at EOF. Numbers are a bit special compared to others, because they don't have any clear character indicating that the number ends. So we can only assume that the number is finished when EOF is reached, although even that isn't necessarily correct in case the stream is terminated unexpectedly. This change is in prepartion for the next change. With current JSON parser this issue could never happen because "}" was expected just before EOF.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 01 Feb 2016 17:30:23 +0200
parents 2166e0f25e43
children 8bcb62e748b9
files src/lib/json-parser.c
diffstat 1 files changed, 13 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/json-parser.c	Mon Feb 01 17:00:11 2016 +0200
+++ b/src/lib/json-parser.c	Mon Feb 01 17:30:23 2016 +0200
@@ -37,6 +37,7 @@
 	ARRAY(enum json_state) nesting;
 	unsigned int nested_skip_count;
 	bool skipping;
+	bool seen_eof;
 };
 
 static int json_parser_read_more(struct json_parser *parser)
@@ -57,13 +58,19 @@
 			parser->error = "Token too large";
 			return -1;
 		}
-		if (ret <= 0)
+		if (ret < 0 && !parser->seen_eof &&
+		    i_stream_get_data_size(parser->input) > 0 &&
+		    parser->input->stream_errno == 0) {
+			/* call it once more to finish any pending number */
+			parser->seen_eof = TRUE;
+		} else if (ret <= 0) {
 			return ret;
-
-		cur_highwater = parser->input->v_offset +
-			i_stream_get_data_size(parser->input);
-		i_assert(parser->highwater_offset < cur_highwater);
-		parser->highwater_offset = cur_highwater;
+		} else {
+			cur_highwater = parser->input->v_offset +
+				i_stream_get_data_size(parser->input);
+			i_assert(parser->highwater_offset < cur_highwater);
+			parser->highwater_offset = cur_highwater;
+		}
 	}
 
 	parser->start = parser->data = i_stream_get_data(parser->input, &size);