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:
Jim Fehlig 2014-07-08 11:15:34 -06:00
parent 92cd6b677e
commit c4f66bb8be
3 changed files with 10 additions and 4 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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);