summaryrefslogtreecommitdiff
path: root/include/qom/object_interfaces.h
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2016-04-27 16:29:09 +0200
committerMarkus Armbruster <armbru@redhat.com>2016-04-28 08:19:36 +0200
commit51b9b478cc238ad23a78ffd713f9c18bbc3907e6 (patch)
treedac1b1a7ec5c83135cd8524014e4aa528291373a /include/qom/object_interfaces.h
parentd9d3aaea0b3fbb5028e20316bdb93359487cd01f (diff)
downloadqemu-51b9b478cc238ad23a78ffd713f9c18bbc3907e6.tar.gz
qom: -object error messages lost location, restore it
qemu_opts_foreach() runs its callback with the error location set to the option's location. Any errors the callback reports use the option's location automatically. Commit 90998d5 moved the actual error reporting from "inside" qemu_opts_foreach() to after it. Here's a typical hunk: if (qemu_opts_foreach(qemu_find_opts("object"), - object_create, - object_create_initial, NULL)) { + user_creatable_add_opts_foreach, + object_create_initial, &err)) { + error_report_err(err); exit(1); } Before, object_create() reports from within qemu_opts_foreach(), using the option's location. Afterwards, we do it after qemu_opts_foreach(), using whatever location happens to be current there. Commonly a "none" location. This is because Error objects don't have location information. Problematic. Reproducer: $ qemu-system-x86_64 -nodefaults -display none -object secret,id=foo,foo=bar qemu-system-x86_64: Property '.foo' not found Note no location. This commit restores it: qemu-system-x86_64: -object secret,id=foo,foo=bar: Property '.foo' not found Note that the qemu_opts_foreach() bug just fixed could mask the bug here: if the location it leaves dangling hasn't been clobbered, yet, it's the correct one. Reported-by: Eric Blake <eblake@redhat.com> Cc: Daniel P. Berrange <berrange@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <1461767349-15329-4-git-send-email-armbru@redhat.com> Reviewed-by: Daniel P. Berrange <berrange@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> [Paragraph on Error added to commit message]
Diffstat (limited to 'include/qom/object_interfaces.h')
-rw-r--r--include/qom/object_interfaces.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index d579746db6..8b17f4def7 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -140,7 +140,7 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
* user_creatable_add_opts_foreach:
* @opaque: a user_creatable_add_opts_predicate callback or NULL
* @opts: options to create
- * @errp: if an error occurs, a pointer to an area to store the error
+ * @errp: unused
*
* An iterator callback to be used in conjunction with
* the qemu_opts_foreach() method for creating a list of
@@ -148,8 +148,9 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
*
* The @opaque parameter can be passed a user_creatable_add_opts_predicate
* callback to filter which types of object are created during iteration.
+ * When it fails, report the error.
*
- * Returns: 0 on success, -1 on error
+ * Returns: 0 on success, -1 when an error was reported.
*/
int user_creatable_add_opts_foreach(void *opaque,
QemuOpts *opts, Error **errp);