qemu-irix/docs
Eric Blake ed84153519 qapi-commands: Wrap argument visit in visit_start_struct
The qmp-input visitor was allowing callers to play rather fast
and loose: when visiting a QDict, you could grab members of the
root dictionary without first pushing into the dict; among the
culprit callers was the generated marshal code on the 'arguments'
dictionary of a QMP command.  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.

Generated code grows as follows:

|@@ -515,7 +641,12 @@ void qmp_marshal_blockdev_backup(QDict *
|     BlockdevBackup arg = {0};
|
|     v = qmp_input_get_visitor(qiv);
|+    visit_start_struct(v, NULL, NULL, 0, &err);
|+    if (err) {
|+        goto out;
|+    }
|     visit_type_BlockdevBackup_members(v, &arg, &err);
|+    visit_end_struct(v, err ? NULL : &err);
|     if (err) {
|         goto out;
|     }
|@@ -527,7 +715,9 @@ out:
|     qmp_input_visitor_cleanup(qiv);
|     qdv = qapi_dealloc_visitor_new();
|     v = qapi_dealloc_get_visitor(qdv);
|+    visit_start_struct(v, NULL, NULL, 0, NULL);
|     visit_type_BlockdevBackup_members(v, &arg, NULL);
|+    visit_end_struct(v, NULL);
|     qapi_dealloc_visitor_cleanup(qdv);
| }

The use of 'err ? NULL : &err' is temporary; a later patch will
clean that up when it splits visit_end_struct().

Prior to this patch, the fact that there was no final
visit_end_struct() meant that even though we are using a strict
input visit, the marshalling code was not detecting excess input
at the top level (only in nested levels).  Fortunately, we have
code in monitor.c:qmp_check_client_args() that also checks for
no excess arguments at the top level.  But as the generated code
is more compact than the manual check, a later patch will clean
up monitor.c to drop the redundancy added here.

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1461879932-9020-9-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2016-05-12 09:47:54 +02:00
..
specs fw_cfg: Adopt /opt/RFQDN convention 2016-04-19 16:09:50 +02:00
aio_notify.promela
aio_notify_accept.promela
aio_notify_bug.promela
atomics.txt
bitmaps.md docs: update bitmaps.md 2015-11-17 18:35:56 +08:00
blkdebug.txt blkdebug: Merge hand-rolled and qapi BlkdebugEvent enum 2015-12-17 08:21:27 +01:00
blkverify.txt
bootindex.txt
build-system.txt
ccid.txt
ich9-ehci-uhci.cfg
image-fuzzer.txt
live-block-ops.txt
memory-hotplug.txt
memory.txt docs: fix typo in memory.txt 2016-04-08 00:07:43 +02:00
migration.txt postcopy: Remove the x- 2016-03-11 17:53:59 +05:30
multi-thread-compression.txt
multiple-iothreads.txt
multiseat.txt
pci_expander_bridge.txt pxb: cleanup 2016-03-11 16:59:12 +02:00
q35-chipset.cfg
qapi-code-gen.txt qapi-commands: Wrap argument visit in visit_start_struct 2016-05-12 09:47:54 +02:00
qcow2-cache.txt
qdev-device-use.txt
qemupciserial.inf
qmp-events.txt qmp event: Refactor QUORUM_REPORT_BAD 2016-03-14 16:46:43 +01:00
qmp-intro.txt
qmp-spec.txt qapi: Update docs to match recent generator changes 2016-03-05 10:41:16 +01:00
rcu.txt
rdma.txt
replay.txt replay: introduce block devices record/replay 2016-03-30 12:15:57 +02:00
spice-port-fqdn.txt
throttle.txt docs: Document the throttling infrastructure 2016-02-22 14:08:07 +01:00
tracing.txt docs: Update documentation for stderr (now log) tracing backend. 2016-03-31 09:48:59 +01:00
usb-storage.txt
usb2.txt
virtio-balloon-stats.txt
virtio-migration.txt
vnc-ledstate-Pseudo-encoding.txt
win32-qemu-event.promela
writing-qmp-commands.txt error: More error_setg() usage 2015-11-11 18:56:26 +01:00
xbzrle.txt
xen-save-devices-state.txt