From nobody Wed Nov 5 13:08:35 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1534518847049671.2110649459798; Fri, 17 Aug 2018 08:14:07 -0700 (PDT) Received: from localhost ([::1]:34662 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fqgRx-0004LA-Ug for importer@patchew.org; Fri, 17 Aug 2018 11:14:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46302) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fqgKI-00036J-Nj for qemu-devel@nongnu.org; Fri, 17 Aug 2018 11:06:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fqgKF-0001lT-64 for qemu-devel@nongnu.org; Fri, 17 Aug 2018 11:06:10 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:56258 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fqgKE-0001ja-Ff for qemu-devel@nongnu.org; Fri, 17 Aug 2018 11:06:06 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DB6132BDBF; Fri, 17 Aug 2018 15:06:05 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-56.ams2.redhat.com [10.36.116.56]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B442817305; Fri, 17 Aug 2018 15:06:05 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 7D67C110E36E; Fri, 17 Aug 2018 17:06:00 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Fri, 17 Aug 2018 17:05:33 +0200 Message-Id: <20180817150559.16243-35-armbru@redhat.com> In-Reply-To: <20180817150559.16243-1-armbru@redhat.com> References: <20180817150559.16243-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Fri, 17 Aug 2018 15:06:05 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Fri, 17 Aug 2018 15:06:05 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 34/60] json: Don't pass null @tokens to json_parser_parse() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: marcandre.lureau@redhat.com, mdroth@linux.vnet.ibm.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RDMRC_1 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 =3D 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 Reviewed-by: Eric Blake --- qobject/json-parser.c | 4 ---- 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 f2646dce84..866f7e3f14 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 =3D { .buf =3D tokens }; QObject *result; =20 - if (!tokens) { - return NULL; - } - result =3D parse_value(&ctxt, ap); =20 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 =3D container_of(lexer, JSONMessageParser, l= exer); + QObject *json =3D NULL; Error *err =3D NULL; JSONToken *token; - QObject *json; =20 switch (type) { case JSON_LCURLY: @@ -72,34 +72,33 @@ void json_message_process_token(JSONLexer *lexer, GStri= ng *input, g_queue_push_tail(parser->tokens, token); =20 if (type =3D=3D 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 =3D=3D 0 && parser->bracket_count =3D=3D 0)) { + json =3D json_parser_parse(parser->tokens, parser->ap, &err); + parser->tokens =3D 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 obj= ect * and the maximum recursion depth that a message can force. */ - goto out_emit_bad; + goto out_emit; } =20 return; =20 -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 =3D 0; parser->bracket_count =3D 0; - json =3D json_parser_parse(parser->tokens, parser->ap, &err); + json_message_free_tokens(parser); parser->tokens =3D g_queue_new(); parser->token_size =3D 0; parser->emit(parser->opaque, json, err); --=20 2.17.1