From: Maxim Nestratov Date: Tue, 12 Apr 2016 17:30:57 +0000 (+0300) Subject: vz: fix possible vzDomainDefineXMLFlags and prlsdkNewDomainByHandle race X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=eb5e9c1ea90327d49eafd59db8cc809bd96e8d19;p=libvirt.git vz: fix possible vzDomainDefineXMLFlags and prlsdkNewDomainByHandle race Lock driver when a new domain is created in prlsdkNewDomainByHandle and try to find it in the list under lock again because it can race with vzDomainDefineXMLFlags when a domain with the same uuid is added via vz dispatcher directly and libvirt define. Signed-off-by: Maxim Nestratov --- diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 658fdf9388..6131b9db86 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -1254,9 +1254,18 @@ prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom) unsigned char uuid[VIR_UUID_BUFLEN]; char *name = NULL; + virObjectLock(driver); if (prlsdkGetDomainIds(sdkdom, &name, uuid) < 0) goto cleanup; + /* we should make sure that there is no such a VM exists */ + dom = virDomainObjListFindByUUID(driver->domains, uuid); + if (dom) { + virObjectUnlock(dom); + dom = NULL; + goto cleanup; + } + if (!(dom = vzNewDomain(driver, name, uuid))) goto cleanup; @@ -1267,6 +1276,7 @@ prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom) } cleanup: + virObjectUnlock(driver); VIR_FREE(name); return dom; }