-object will process its QDicts in two steps, first for the "early" objects and then for the "late" objects. If qom-type is removed by the "early" pass, the late pass fails. So just create a shallow copy of the QDict in user_creatable_add_dict.
Signed-off-by: Paolo Bonzini <[email protected]> --- include/qom/object_interfaces.h | 2 +- qom/object_interfaces.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h index abb23eaea3..ed0d7d663b 100644 --- a/include/qom/object_interfaces.h +++ b/include/qom/object_interfaces.h @@ -102,7 +102,7 @@ Object *user_creatable_add_type(const char *type, const char *id, * * Returns: %true on success, %false on failure. */ -bool user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp); +bool user_creatable_add_dict(const QDict *qdict, bool keyval, Error **errp); /** * user_creatable_add_opts: diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 97bf88908e..fbbf5e8ad3 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -105,24 +105,25 @@ out: return obj; } -bool user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp) +bool user_creatable_add_dict(const QDict *dict, bool keyval, Error **errp) { Visitor *v; - Object *obj; + Object *obj = NULL; + QDict *qdict = qdict_clone_shallow(dict); g_autofree char *type = NULL; g_autofree char *id = NULL; type = g_strdup(qdict_get_try_str(qdict, "qom-type")); if (!type) { error_setg(errp, QERR_MISSING_PARAMETER, "qom-type"); - return false; + goto out; } qdict_del(qdict, "qom-type"); id = g_strdup(qdict_get_try_str(qdict, "id")); if (!id) { error_setg(errp, QERR_MISSING_PARAMETER, "id"); - return false; + goto out; } qdict_del(qdict, "id"); @@ -134,6 +135,8 @@ bool user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp) obj = user_creatable_add_type(type, id, qdict, v, errp); visit_free(v); object_unref(obj); +out: + qobject_unref(qdict); return !!obj; } -- 2.26.2
