hmp: Call visit_end_struct() after visit_start_struct() succeeds

When visit_start_struct() succeeds, visit_end_struct() must be called.
hmp_object_add() doesn't when a member visit fails.  As far as I can
tell, the opts visitor copes okay with the misuse.  Fix it anyway.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
Markus Armbruster 2014-05-07 09:53:51 +02:00 committed by Luiz Capitulino
parent be3c771796
commit f9f3a5ecde

16
hmp.c
View File

@ -1388,6 +1388,7 @@ void hmp_netdev_del(Monitor *mon, const QDict *qdict)
void hmp_object_add(Monitor *mon, const QDict *qdict) void hmp_object_add(Monitor *mon, const QDict *qdict)
{ {
Error *err = NULL; Error *err = NULL;
Error *err_end = NULL;
QemuOpts *opts; QemuOpts *opts;
char *type = NULL; char *type = NULL;
char *id = NULL; char *id = NULL;
@ -1411,24 +1412,23 @@ void hmp_object_add(Monitor *mon, const QDict *qdict)
qdict_del(pdict, "qom-type"); qdict_del(pdict, "qom-type");
visit_type_str(opts_get_visitor(ov), &type, "qom-type", &err); visit_type_str(opts_get_visitor(ov), &type, "qom-type", &err);
if (err) { if (err) {
goto out_clean; goto out_end;
} }
qdict_del(pdict, "id"); qdict_del(pdict, "id");
visit_type_str(opts_get_visitor(ov), &id, "id", &err); visit_type_str(opts_get_visitor(ov), &id, "id", &err);
if (err) { if (err) {
goto out_clean; goto out_end;
} }
object_add(type, id, pdict, opts_get_visitor(ov), &err); object_add(type, id, pdict, opts_get_visitor(ov), &err);
if (err) {
goto out_clean; out_end:
} visit_end_struct(opts_get_visitor(ov), &err_end);
visit_end_struct(opts_get_visitor(ov), &err); if (!err && err_end) {
if (err) {
qmp_object_del(id, NULL); qmp_object_del(id, NULL);
} }
error_propagate(&err, err_end);
out_clean: out_clean:
opts_visitor_cleanup(ov); opts_visitor_cleanup(ov);