Fix crash due to failure to unregister event callbacks in QEMU driver (David Lively)

This commit is contained in:
Daniel P. Berrange 2008-11-21 10:17:22 +00:00
parent f6dacb21d2
commit 41f14d6ea5
4 changed files with 53 additions and 1 deletions

View File

@ -1,3 +1,11 @@
Fri Nov 21 10:14:14 BST 2008 Daniel P. Berrange <berrange@redhat.com>
Fix crash due to failure to unregister event callbacks on
connection close (David Lively)
* src/domain_event.c, src/domain_event.h: Helper for unregistering
all callbacks
* src/qemu_driver.c: Unregister all callbacks on connection close
Fri Nov 21 10:10:14 BST 2008 Daniel P. Berrange <berrange@redhat.com>
* src/Makefile.am: Include Xen compile flags for libvirt_driver.la

View File

@ -87,6 +87,44 @@ virDomainEventCallbackListRemove(virConnectPtr conn,
return -1;
}
/**
* virDomainEventCallbackListRemoveConn:
* @conn: pointer to the connection
* @cbList: the list
*
* Internal function to remove all of a given connection's callback
* from a virDomainEventCallbackListPtr
*/
int
virDomainEventCallbackListRemoveConn(virConnectPtr conn,
virDomainEventCallbackListPtr cbList)
{
int old_count = cbList->count;
int i;
for (i = 0 ; i < cbList->count ; i++) {
if(cbList->callbacks[i]->conn == conn) {
virFreeCallback freecb = cbList->callbacks[i]->freecb;
if (freecb)
(*freecb)(cbList->callbacks[i]->opaque);
virUnrefConnect(cbList->callbacks[i]->conn);
VIR_FREE(cbList->callbacks[i]);
if (i < (cbList->count - 1))
memmove(cbList->callbacks + i,
cbList->callbacks + i + 1,
sizeof(*(cbList->callbacks)) *
(cbList->count - (i + 1)));
cbList->count--;
i--;
}
}
if (cbList->count < old_count &&
VIR_REALLOC_N(cbList->callbacks, cbList->count) < 0) {
; /* Failure to reduce memory allocation isn't fatal */
}
return 0;
}
/**
* virDomainEventCallbackListAdd:
* @conn: pointer to the connection

View File

@ -55,6 +55,9 @@ int virDomainEventCallbackListRemove(virConnectPtr conn,
virDomainEventCallbackListPtr cbList,
virConnectDomainEventCallback callback);
int virDomainEventCallbackListRemoveConn(virConnectPtr conn,
virDomainEventCallbackListPtr cbList);
/**
* Dispatching domain events that come in while
* in a call / response rpc

View File

@ -1235,7 +1235,10 @@ static virDrvOpenStatus qemudOpen(virConnectPtr conn,
}
static int qemudClose(virConnectPtr conn) {
/*struct qemud_driver *driver = (struct qemud_driver *)conn->privateData;*/
struct qemud_driver *driver = (struct qemud_driver *)conn->privateData;
/* Get rid of callbacks registered for this conn */
virDomainEventCallbackListRemoveConn(conn, driver->domainEventCallbacks);
conn->privateData = NULL;