提交 c4f66bb8 编写于 作者: J Jim Fehlig

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.
上级 92cd6b67
......@@ -4435,7 +4435,7 @@ libxlDomainMigratePrepare3Params(virConnectPtr dconn,
if (virDomainMigratePrepare3ParamsEnsureACL(dconn, def) < 0)
goto error;
if (libxlDomainMigrationPrepare(dconn, def, uri_in, uri_out, flags) < 0)
if (libxlDomainMigrationPrepare(dconn, &def, uri_in, uri_out, flags) < 0)
goto error;
return 0;
......
......@@ -265,7 +265,7 @@ libxlDomainMigrationPrepareDef(libxlDriverPrivatePtr driver,
int
libxlDomainMigrationPrepare(virConnectPtr dconn,
virDomainDefPtr def,
virDomainDefPtr *def,
const char *uri_in,
char **uri_out,
unsigned int flags)
......@@ -283,12 +283,13 @@ libxlDomainMigrationPrepare(virConnectPtr dconn,
size_t i;
int ret = -1;
if (!(vm = virDomainObjListAdd(driver->domains, def,
if (!(vm = virDomainObjListAdd(driver->domains, *def,
driver->xmlopt,
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
NULL)))
goto error;
*def = NULL;
/* Create socket connection to receive migration data */
if (!uri_in) {
......@@ -405,6 +406,11 @@ libxlDomainMigrationPrepare(virConnectPtr dconn,
virNetSocketClose(socks[i]);
virObjectUnref(socks[i]);
}
/* Remove virDomainObj from domain list */
if (vm) {
virDomainObjListRemove(driver->domains, vm);
vm = NULL;
}
done:
virURIFree(uri);
......
......@@ -50,7 +50,7 @@ libxlDomainMigrationPrepareDef(libxlDriverPrivatePtr driver,
int
libxlDomainMigrationPrepare(virConnectPtr dconn,
virDomainDefPtr def,
virDomainDefPtr *def,
const char *uri_in,
char **uri_out,
unsigned int flags);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册