mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 09:55:18 +00:00
libxl: remove domain when migration prepare fails
In libxlDomainMigrationPrepare(), a new virDomainObj is created from the incoming domain def and added to the driver's domain list, but never removed if there are subsequent failures during the prepare phase. targethost# virsh list --all sourcehost# virsh migrate --live dom xen+ssh://targethost/system error: operation failed: Fail to create socket for incoming migration. targethost# virsh list --all error: Failed to list domains error: name in virGetDomain must not be NULL After adding code to remove the domain on prepare failure, noticed that libvirtd crashed due to double free of the virDomainDef. Similar to the qemu driver, pass a pointer to virDomainDefPtr so it can be set to NULL once a virDomainObj is created from it.
This commit is contained in:
parent
92cd6b677e
commit
c4f66bb8be
@ -4435,7 +4435,7 @@ libxlDomainMigratePrepare3Params(virConnectPtr dconn,
|
|||||||
if (virDomainMigratePrepare3ParamsEnsureACL(dconn, def) < 0)
|
if (virDomainMigratePrepare3ParamsEnsureACL(dconn, def) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (libxlDomainMigrationPrepare(dconn, def, uri_in, uri_out, flags) < 0)
|
if (libxlDomainMigrationPrepare(dconn, &def, uri_in, uri_out, flags) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -265,7 +265,7 @@ libxlDomainMigrationPrepareDef(libxlDriverPrivatePtr driver,
|
|||||||
|
|
||||||
int
|
int
|
||||||
libxlDomainMigrationPrepare(virConnectPtr dconn,
|
libxlDomainMigrationPrepare(virConnectPtr dconn,
|
||||||
virDomainDefPtr def,
|
virDomainDefPtr *def,
|
||||||
const char *uri_in,
|
const char *uri_in,
|
||||||
char **uri_out,
|
char **uri_out,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
@ -283,12 +283,13 @@ libxlDomainMigrationPrepare(virConnectPtr dconn,
|
|||||||
size_t i;
|
size_t i;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains, def,
|
if (!(vm = virDomainObjListAdd(driver->domains, *def,
|
||||||
driver->xmlopt,
|
driver->xmlopt,
|
||||||
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
|
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
|
||||||
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
NULL)))
|
NULL)))
|
||||||
goto error;
|
goto error;
|
||||||
|
*def = NULL;
|
||||||
|
|
||||||
/* Create socket connection to receive migration data */
|
/* Create socket connection to receive migration data */
|
||||||
if (!uri_in) {
|
if (!uri_in) {
|
||||||
@ -405,6 +406,11 @@ libxlDomainMigrationPrepare(virConnectPtr dconn,
|
|||||||
virNetSocketClose(socks[i]);
|
virNetSocketClose(socks[i]);
|
||||||
virObjectUnref(socks[i]);
|
virObjectUnref(socks[i]);
|
||||||
}
|
}
|
||||||
|
/* Remove virDomainObj from domain list */
|
||||||
|
if (vm) {
|
||||||
|
virDomainObjListRemove(driver->domains, vm);
|
||||||
|
vm = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
virURIFree(uri);
|
virURIFree(uri);
|
||||||
|
@ -50,7 +50,7 @@ libxlDomainMigrationPrepareDef(libxlDriverPrivatePtr driver,
|
|||||||
|
|
||||||
int
|
int
|
||||||
libxlDomainMigrationPrepare(virConnectPtr dconn,
|
libxlDomainMigrationPrepare(virConnectPtr dconn,
|
||||||
virDomainDefPtr def,
|
virDomainDefPtr *def,
|
||||||
const char *uri_in,
|
const char *uri_in,
|
||||||
char **uri_out,
|
char **uri_out,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user