diff --git a/vl.c b/vl.c index 245b2bad6d..300a609479 100644 --- a/vl.c +++ b/vl.c @@ -2819,6 +2819,7 @@ static bool object_create_delayed(const char *type) static int object_create(void *opaque, QemuOpts *opts, Error **errp) { Error *err = NULL; + Error *err_end = NULL; char *type = NULL; char *id = NULL; OptsVisitor *ov; @@ -2841,23 +2842,24 @@ static int object_create(void *opaque, QemuOpts *opts, Error **errp) goto out; } if (!type_predicate(type)) { + visit_end_struct(v, NULL); goto out; } qdict_del(pdict, "id"); visit_type_str(v, &id, "id", &err); if (err) { - goto out; + goto out_end; } object_add(type, id, pdict, v, &err); - if (err) { - goto out; - } - visit_end_struct(v, &err); - if (err) { + +out_end: + visit_end_struct(v, &err_end); + if (!err && err_end) { qmp_object_del(id, NULL); } + error_propagate(&err, err_end); out: opts_visitor_cleanup(ov);