mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
admin: Use the newly introduced close callback handling helpers
Use the newly introduced close callback helpers to make the code look just a bit cleaner and more importantly, to fix the following memleak regarding a dangling virAdmConnect object reference caused by assigning NULL to the close callback data once the catch-disconnect routine used the callback followed by a comparison of NULL to the originally defined close callback (which at that moment had already been NULL'd by remoteAdminClientCloseFunc) in virAdmConnectCloseCallbackUnregister. 717 (88 direct, 629 indirect) bytes in 1 blocks are definitely lost record 110 of 141 at 0x4C2A988: calloc (vg_replace_malloc.c:711) by 0x530696F: virAllocVar (viralloc.c:560) by 0x53689E6: virObjectNew (virobject.c:193) by 0x5368B5E: virObjectLockableNew (virobject.c:219) by 0x4E3E7EE: virAdmConnectNew (datatypes.c:900) by 0x4E398BB: virAdmConnectOpen (libvirt-admin.c:220) by 0x10D3E3: vshAdmConnect (virt-admin.c:161) by 0x10D624: vshAdmReconnect (virt-admin.c:215) by 0x10DB0A: cmdConnect (virt-admin.c:353) by 0x11288F: vshCommandRun (vsh.c:1313) by 0x10FDB6: main (virt-admin.c:1439) Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1357358 Signed-off-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
parent
7cea74a3b2
commit
e555ed6f7b
@ -144,11 +144,7 @@ remoteAdminClientCloseFunc(virNetClientPtr client ATTRIBUTE_UNUSED,
|
||||
VIR_DEBUG("Triggering connection close callback %p reason=%d, opaque=%p",
|
||||
cbdata->callback, reason, cbdata->opaque);
|
||||
cbdata->callback(cbdata->conn, reason, cbdata->opaque);
|
||||
|
||||
if (cbdata->freeCallback)
|
||||
cbdata->freeCallback(cbdata->opaque);
|
||||
cbdata->callback = NULL;
|
||||
cbdata->freeCallback = NULL;
|
||||
virAdmConnectCloseCallbackDataReset(cbdata);
|
||||
}
|
||||
virObjectUnlock(cbdata);
|
||||
}
|
||||
|
@ -928,10 +928,7 @@ virAdmConnectCloseCallbackDataDispose(void *obj)
|
||||
virAdmConnectCloseCallbackDataPtr cb_data = obj;
|
||||
|
||||
virObjectLock(cb_data);
|
||||
|
||||
if (cb_data->freeCallback)
|
||||
cb_data->freeCallback(cb_data->opaque);
|
||||
|
||||
virAdmConnectCloseCallbackDataReset(cb_data);
|
||||
virObjectUnlock(cb_data);
|
||||
}
|
||||
|
||||
|
@ -513,29 +513,13 @@ int virAdmConnectUnregisterCloseCallback(virAdmConnectPtr conn,
|
||||
virResetLastError();
|
||||
|
||||
virCheckAdmConnectReturn(conn, -1);
|
||||
|
||||
virObjectLock(conn->closeCallback);
|
||||
|
||||
virCheckNonNullArgGoto(cb, error);
|
||||
|
||||
if (conn->closeCallback->callback != cb) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||
_("A different callback was requested"));
|
||||
if (virAdmConnectCloseCallbackDataUnregister(conn->closeCallback, cb) < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
conn->closeCallback->callback = NULL;
|
||||
if (conn->closeCallback->freeCallback)
|
||||
conn->closeCallback->freeCallback(conn->closeCallback->opaque);
|
||||
conn->closeCallback->freeCallback = NULL;
|
||||
|
||||
virObjectUnlock(conn->closeCallback);
|
||||
virObjectUnref(conn);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
virObjectUnlock(conn->closeCallback);
|
||||
virDispatchError(NULL);
|
||||
return -1;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user