diff --git a/qobject/block-qdict.c b/qobject/block-qdict.c index df833083a7..36129e7379 100644 --- a/qobject/block-qdict.c +++ b/qobject/block-qdict.c @@ -114,19 +114,30 @@ static void qdict_flatten_qdict(QDict *qdict, QDict *target, const char *prefix) /* * Flatten non-empty QDict and QList recursively into @target, - * copy other objects to @target + * copy other objects to @target. + * On the root level (if @qdict == @target), remove flattened + * nested QDicts and QLists from @qdict. + * + * (Note that we do not need to remove entries from nested + * dicts or lists. Their reference count is decremented on + * the root level, so there are no leaks. In fact, if they + * have a reference count greater than one, we are probably + * well advised not to modify them altogether.) */ if (dict_val && qdict_size(dict_val)) { qdict_flatten_qdict(dict_val, target, new_key ? new_key : entry->key); - qdict_del(qdict, entry->key); + if (target == qdict) { + qdict_del(qdict, entry->key); + } } else if (list_val && !qlist_empty(list_val)) { qdict_flatten_qlist(list_val, target, new_key ? new_key : entry->key); - qdict_del(qdict, entry->key); + if (target == qdict) { + qdict_del(qdict, entry->key); + } } else if (target != qdict) { qdict_put_obj(target, new_key, qobject_ref(value)); - qdict_del(qdict, entry->key); } g_free(new_key);