Mercurial > dovecot > core-2.2
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);