From patchwork Tue Mar 1 05:14:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Blake X-Patchwork-Id: 8462001 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id DDE839F372 for ; Tue, 1 Mar 2016 05:21:03 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3AD4620304 for ; Tue, 1 Mar 2016 05:21:03 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 75294202FF for ; Tue, 1 Mar 2016 05:21:02 +0000 (UTC) Received: from localhost ([::1]:40934 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aack1-0002fF-NE for patchwork-qemu-devel@patchwork.kernel.org; Tue, 01 Mar 2016 00:21:01 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59791) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aacdy-0000Lu-3T for qemu-devel@nongnu.org; Tue, 01 Mar 2016 00:14:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aacdx-0006Ru-1h for qemu-devel@nongnu.org; Tue, 01 Mar 2016 00:14:46 -0500 Received: from mx1.redhat.com ([209.132.183.28]:38370) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aacdw-0006Rh-Qv for qemu-devel@nongnu.org; Tue, 01 Mar 2016 00:14:44 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 8BB2FA8C; Tue, 1 Mar 2016 05:14:44 +0000 (UTC) Received: from red.redhat.com (ovpn-113-165.phx2.redhat.com [10.3.113.165]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u215EZ9Y018132; Tue, 1 Mar 2016 00:14:44 -0500 From: Eric Blake To: qemu-devel@nongnu.org Date: Mon, 29 Feb 2016 22:14:28 -0700 Message-Id: <1456809272-14184-15-git-send-email-eblake@redhat.com> In-Reply-To: <1456809272-14184-1-git-send-email-eblake@redhat.com> References: <1456809272-14184-1-git-send-email-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: armbru@redhat.com, Michael Roth Subject: [Qemu-devel] [PATCH v12 14/18] qapi-commands: Wrap argument visit in visit_start_struct X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The qmp-input visitor was playing rather fast and loose: when visiting a QDict, you could grab members of the root dictionary without first pushing into the dict. But we are about to tighten the input visitor, at which point the generated marshal code MUST follow the same paradigms as everyone else, of pushing into the struct before grabbing its keys, because the value of 'name' should be ignored on the top-level visit. It will also make things easier to follow when we introduce boxed command parameters, where we call visit_type_FOO() instead of individual members of FOO, since visit_type_FOO() also uses a level of visit_start_struct() for handling the same QDict input. Generated code grows as follows: |@@ -63,18 +63,28 @@ void qmp_marshal_add_fd(QDict *args, QOb | char *opaque = NULL; | | v = qmp_input_get_visitor(qiv); |+ visit_start_struct(v, NULL, NULL, 0, &err); |+ if (err) { |+ goto out; |+ } | if (visit_optional(v, "fdset-id", &has_fdset_id)) { | visit_type_int(v, "fdset-id", &fdset_id, &err); | if (err) { |- goto out; |+ goto out_obj; | } | } | if (visit_optional(v, "opaque", &has_opaque)) { | visit_type_str(v, "opaque", &opaque, &err); | if (err) { |- goto out; |+ goto out_obj; | } | } |+ visit_check_struct(v, &err); |+out_obj: |+ visit_end_struct(v); |+ if (err) { |+ goto out; |+ } | | retval = qmp_add_fd(has_fdset_id, fdset_id, has_opaque, opaque, &err); Note that this change could also make it possible for the marshalling code to automatically detect excess input at the top level, and not just in nested dictionaries. However, that checking is not currently useful (and we rely on the manual checking in monitor.c:qmp_check_client_args() instead) as long as qmp-commands.hx uses .args_type, and as long as we have 'name:O' as an arg-type that explicitly allows unknown top-level keys because we haven't yet converted 'device_add' and 'netdev_add' to introspectible use of 'any'. Signed-off-by: Eric Blake --- v12: new patch --- scripts/qapi-commands.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 7c9cfbf..a586676 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -109,14 +109,28 @@ def gen_marshal_input_visit(arg_type, dealloc=False): else: ret += mcgen(''' v = qmp_input_get_visitor(qiv); + visit_start_struct(v, NULL, NULL, 0, &err); + if (err) { + goto out; + } ''') - ret += gen_visit_members(arg_type.members, skiperr=dealloc) + ret += gen_visit_members(arg_type.members, skiperr=dealloc, + label='out_obj') if dealloc: ret += mcgen(''' qapi_dealloc_visitor_cleanup(qdv); ''') + else: + ret += mcgen(''' + visit_check_struct(v, &err); +out_obj: + visit_end_struct(v); + if (err) { + goto out; + } +''') return ret