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]
This commit is contained in:
parent
d9d3aaea0b
commit
51b9b478cc
@ -140,7 +140,7 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
|
|||||||
* user_creatable_add_opts_foreach:
|
* user_creatable_add_opts_foreach:
|
||||||
* @opaque: a user_creatable_add_opts_predicate callback or NULL
|
* @opaque: a user_creatable_add_opts_predicate callback or NULL
|
||||||
* @opts: options to create
|
* @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
|
* An iterator callback to be used in conjunction with
|
||||||
* the qemu_opts_foreach() method for creating a list of
|
* 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
|
* The @opaque parameter can be passed a user_creatable_add_opts_predicate
|
||||||
* callback to filter which types of object are created during iteration.
|
* 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,
|
int user_creatable_add_opts_foreach(void *opaque,
|
||||||
QemuOpts *opts, Error **errp);
|
QemuOpts *opts, Error **errp);
|
||||||
|
39
qemu-img.c
39
qemu-img.c
@ -435,8 +435,7 @@ static int img_create(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,7 +597,6 @@ static int img_check(int argc, char **argv)
|
|||||||
bool writethrough;
|
bool writethrough;
|
||||||
ImageCheck *check;
|
ImageCheck *check;
|
||||||
bool quiet = false;
|
bool quiet = false;
|
||||||
Error *local_err = NULL;
|
|
||||||
bool image_opts = false;
|
bool image_opts = false;
|
||||||
|
|
||||||
fmt = NULL;
|
fmt = NULL;
|
||||||
@ -679,8 +677,7 @@ static int img_check(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -871,8 +868,7 @@ static int img_commit(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1133,7 +1129,6 @@ static int img_compare(int argc, char **argv)
|
|||||||
int64_t nb_sectors;
|
int64_t nb_sectors;
|
||||||
int c, pnum;
|
int c, pnum;
|
||||||
uint64_t progress_base;
|
uint64_t progress_base;
|
||||||
Error *local_err = NULL;
|
|
||||||
bool image_opts = false;
|
bool image_opts = false;
|
||||||
|
|
||||||
cache = BDRV_DEFAULT_CACHE;
|
cache = BDRV_DEFAULT_CACHE;
|
||||||
@ -1201,8 +1196,7 @@ static int img_compare(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
ret = 2;
|
ret = 2;
|
||||||
goto out4;
|
goto out4;
|
||||||
}
|
}
|
||||||
@ -1864,8 +1858,7 @@ static int img_convert(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
goto fail_getopt;
|
goto fail_getopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2299,7 +2292,6 @@ static int img_info(int argc, char **argv)
|
|||||||
bool chain = false;
|
bool chain = false;
|
||||||
const char *filename, *fmt, *output;
|
const char *filename, *fmt, *output;
|
||||||
ImageInfoList *list;
|
ImageInfoList *list;
|
||||||
Error *local_err = NULL;
|
|
||||||
bool image_opts = false;
|
bool image_opts = false;
|
||||||
|
|
||||||
fmt = NULL;
|
fmt = NULL;
|
||||||
@ -2363,8 +2355,7 @@ static int img_info(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2513,7 +2504,6 @@ static int img_map(int argc, char **argv)
|
|||||||
int64_t length;
|
int64_t length;
|
||||||
MapEntry curr = { .length = 0 }, next;
|
MapEntry curr = { .length = 0 }, next;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
Error *local_err = NULL;
|
|
||||||
bool image_opts = false;
|
bool image_opts = false;
|
||||||
|
|
||||||
fmt = NULL;
|
fmt = NULL;
|
||||||
@ -2573,8 +2563,7 @@ static int img_map(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2717,8 +2706,7 @@ static int img_snapshot(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(err);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2867,8 +2855,7 @@ static int img_rebase(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3133,7 +3120,6 @@ static int img_resize(int argc, char **argv)
|
|||||||
bool quiet = false;
|
bool quiet = false;
|
||||||
BlockBackend *blk = NULL;
|
BlockBackend *blk = NULL;
|
||||||
QemuOpts *param;
|
QemuOpts *param;
|
||||||
Error *local_err = NULL;
|
|
||||||
|
|
||||||
static QemuOptsList resize_options = {
|
static QemuOptsList resize_options = {
|
||||||
.name = "resize_options",
|
.name = "resize_options",
|
||||||
@ -3204,8 +3190,7 @@ static int img_resize(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3297,7 +3282,6 @@ static int img_amend(int argc, char **argv)
|
|||||||
bool quiet = false, progress = false;
|
bool quiet = false, progress = false;
|
||||||
BlockBackend *blk = NULL;
|
BlockBackend *blk = NULL;
|
||||||
BlockDriverState *bs = NULL;
|
BlockDriverState *bs = NULL;
|
||||||
Error *local_err = NULL;
|
|
||||||
bool image_opts = false;
|
bool image_opts = false;
|
||||||
|
|
||||||
cache = BDRV_DEFAULT_CACHE;
|
cache = BDRV_DEFAULT_CACHE;
|
||||||
@ -3365,8 +3349,7 @@ static int img_amend(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto out_no_progress;
|
goto out_no_progress;
|
||||||
}
|
}
|
||||||
|
@ -534,8 +534,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_error)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_error);
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -711,8 +711,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(&qemu_object_opts,
|
if (qemu_opts_foreach(&qemu_object_opts,
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
NULL, &local_err)) {
|
NULL, NULL)) {
|
||||||
error_report_err(local_err);
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,6 +170,7 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
|
|||||||
{
|
{
|
||||||
bool (*type_predicate)(const char *) = opaque;
|
bool (*type_predicate)(const char *) = opaque;
|
||||||
Object *obj = NULL;
|
Object *obj = NULL;
|
||||||
|
Error *err = NULL;
|
||||||
const char *type;
|
const char *type;
|
||||||
|
|
||||||
type = qemu_opt_get(opts, "qom-type");
|
type = qemu_opt_get(opts, "qom-type");
|
||||||
@ -178,8 +179,9 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
obj = user_creatable_add_opts(opts, errp);
|
obj = user_creatable_add_opts(opts, &err);
|
||||||
if (!obj) {
|
if (!obj) {
|
||||||
|
error_report_err(err);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
object_unref(obj);
|
object_unref(obj);
|
||||||
|
6
vl.c
6
vl.c
@ -4291,8 +4291,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(qemu_find_opts("object"),
|
if (qemu_opts_foreach(qemu_find_opts("object"),
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
object_create_initial, &err)) {
|
object_create_initial, NULL)) {
|
||||||
error_report_err(err);
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4410,8 +4409,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
|
|
||||||
if (qemu_opts_foreach(qemu_find_opts("object"),
|
if (qemu_opts_foreach(qemu_find_opts("object"),
|
||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
object_create_delayed, &err)) {
|
object_create_delayed, NULL)) {
|
||||||
error_report_err(err);
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user