From eb5e9c1ea90327d49eafd59db8cc809bd96e8d19 Mon Sep 17 00:00:00 2001 From: Maxim Nestratov Date: Tue, 12 Apr 2016 20:30:57 +0300 Subject: [PATCH] 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 --- src/vz/vz_sdk.c | 10 ++++++++++ 1 file changed, 10 insertions(+) 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; } -- 2.47.2