mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 01:45:17 +00:00
Fix leak of iterators in virDBusMessageIterEncode
If virDBusMessageIterEncode hits an OOM condition it often leaks the memory associated with the dbus iterator object Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
1bf1b38773
commit
6bf3078657
@ -601,8 +601,10 @@ virDBusMessageIterEncode(DBusMessageIter *rootiter,
|
||||
goto cleanup;
|
||||
if (virDBusTypeStackPush(&stack, &nstack,
|
||||
iter, types,
|
||||
nstruct, narray) < 0)
|
||||
nstruct, narray) < 0) {
|
||||
VIR_FREE(newiter);
|
||||
goto cleanup;
|
||||
}
|
||||
VIR_FREE(contsig);
|
||||
iter = newiter;
|
||||
newiter = NULL;
|
||||
@ -625,8 +627,10 @@ virDBusMessageIterEncode(DBusMessageIter *rootiter,
|
||||
goto cleanup;
|
||||
if (virDBusTypeStackPush(&stack, &nstack,
|
||||
iter, types,
|
||||
nstruct, narray) < 0)
|
||||
nstruct, narray) < 0) {
|
||||
VIR_FREE(newiter);
|
||||
goto cleanup;
|
||||
}
|
||||
iter = newiter;
|
||||
newiter = NULL;
|
||||
types = vsig;
|
||||
@ -657,8 +661,10 @@ virDBusMessageIterEncode(DBusMessageIter *rootiter,
|
||||
|
||||
if (virDBusTypeStackPush(&stack, &nstack,
|
||||
iter, types,
|
||||
nstruct, narray) < 0)
|
||||
nstruct, narray) < 0) {
|
||||
VIR_FREE(newiter);
|
||||
goto cleanup;
|
||||
}
|
||||
VIR_FREE(contsig);
|
||||
iter = newiter;
|
||||
newiter = NULL;
|
||||
@ -678,6 +684,17 @@ virDBusMessageIterEncode(DBusMessageIter *rootiter,
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
while (nstack > 0) {
|
||||
DBusMessageIter *thisiter = iter;
|
||||
VIR_DEBUG("Popping iter=%p", iter);
|
||||
ignore_value(virDBusTypeStackPop(&stack, &nstack, &iter,
|
||||
&types, &nstruct, &narray));
|
||||
VIR_DEBUG("Popped iter=%p", iter);
|
||||
|
||||
if (thisiter != rootiter)
|
||||
VIR_FREE(thisiter);
|
||||
}
|
||||
|
||||
virDBusTypeStackFree(&stack, &nstack);
|
||||
VIR_FREE(contsig);
|
||||
VIR_FREE(newiter);
|
||||
|
Loading…
x
Reference in New Issue
Block a user