diff options
author | Markus Armbruster <armbru@redhat.com> | 2018-08-23 18:40:02 +0200 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2018-08-24 20:26:37 +0200 |
commit | ff281a272f67a07d8ea29ca0350c4a3e0d3de73c (patch) | |
tree | 9bd823ea679b7188ca9d2185b33394e15c946faa | |
parent | 62815d85aed71eff7b6c3a524705180fb04f5d30 (diff) |
json: Don't pass null @tokens to json_parser_parse()
json_parser_parse() normally returns the QObject on success. Except
it returns null when its @tokens argument is null.
Its only caller json_message_process_token() passes null @tokens when
emitting a lexical error. The call is a rather opaque way to say json
= NULL then.
Simplify matters by lifting the assignment to json out of the emit
path: initialize json to null, set it to the value of
json_parser_parse() when there's no lexical error. Drop the special
case from json_parser_parse().
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20180823164025.12553-36-armbru@redhat.com>
-rw-r--r-- | qobject/json-parser.c | 4 | ||||
-rw-r--r-- | qobject/json-streamer.c | 25 |
2 files changed, 12 insertions, 17 deletions
diff --git a/qobject/json-parser.c b/qobject/json-parser.c index 95fa348e21..06aff19a5d 100644 --- a/qobject/json-parser.c +++ b/qobject/json-parser.c @@ -546,10 +546,6 @@ QObject *json_parser_parse(GQueue *tokens, va_list *ap, Error **errp) JSONParserContext ctxt = { .buf = tokens }; QObject *result; - if (!tokens) { - return NULL; - } - result = parse_value(&ctxt, ap); error_propagate(errp, ctxt.err); diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c index 7fd0ff8756..0c33186e8e 100644 --- a/qobject/json-streamer.c +++ b/qobject/json-streamer.c @@ -39,9 +39,9 @@ void json_message_process_token(JSONLexer *lexer, GString *input, JSONTokenType type, int x, int y) { JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer); + QObject *json = NULL; Error *err = NULL; JSONToken *token; - QObject *json; switch (type) { case JSON_LCURLY: @@ -72,34 +72,33 @@ void json_message_process_token(JSONLexer *lexer, GString *input, g_queue_push_tail(parser->tokens, token); if (type == JSON_ERROR) { - goto out_emit_bad; - } else if (parser->brace_count < 0 || + goto out_emit; + } + + if (parser->brace_count < 0 || parser->bracket_count < 0 || (parser->brace_count == 0 && parser->bracket_count == 0)) { + json = json_parser_parse(parser->tokens, parser->ap, &err); + parser->tokens = NULL; goto out_emit; - } else if (parser->token_size > MAX_TOKEN_SIZE || + } + + if (parser->token_size > MAX_TOKEN_SIZE || g_queue_get_length(parser->tokens) > MAX_TOKEN_COUNT || parser->bracket_count + parser->brace_count > MAX_NESTING) { /* Security consideration, we limit total memory allocated per object * and the maximum recursion depth that a message can force. */ - goto out_emit_bad; + goto out_emit; } return; -out_emit_bad: - /* - * Clear out token list and tell the parser to emit an error - * indication by passing it a NULL list - */ - json_message_free_tokens(parser); out_emit: - /* send current list of tokens to parser and reset tokenizer */ parser->brace_count = 0; parser->bracket_count = 0; - json = json_parser_parse(parser->tokens, parser->ap, &err); + json_message_free_tokens(parser); parser->tokens = g_queue_new(); parser->token_size = 0; parser->emit(parser->opaque, json, err); |