Well, the parallelsConnectOpen() joins several sub-driver openings
into one big if condition. If any of sub-driver fails to open, the
whole API finishes immediately. The problem is, sub-drivers may have
left some memory allocated. Fortunately, we have a free function for
that: parallelsConnectClose(). This is, however, not prepared for
partially allocated driver structure. So, prepare the free function
for it and call it at the right place, in the if body.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
if ((ret = parallelsOpenDefault(conn)) != VIR_DRV_OPEN_SUCCESS ||
(ret = parallelsStorageOpen(conn, flags)) != VIR_DRV_OPEN_SUCCESS ||
- (ret = parallelsNetworkOpen(conn, flags)) != VIR_DRV_OPEN_SUCCESS)
+ (ret = parallelsNetworkOpen(conn, flags)) != VIR_DRV_OPEN_SUCCESS) {
+ parallelsConnectClose(conn);
return ret;
+ }
return VIR_DRV_OPEN_SUCCESS;
}
{
parallelsConnPtr privconn = conn->privateData;
+ if (!privconn)
+ return 0;
+
parallelsNetworkClose(conn);
parallelsStorageClose(conn);
int parallelsNetworkClose(virConnectPtr conn)
{
parallelsConnPtr privconn = conn->privateData;
+
+ if (!privconn)
+ return 0;
+
parallelsDriverLock(privconn);
virNetworkObjListFree(privconn->networks);
VIR_FREE(privconn->networks);
{
parallelsConnPtr privconn = conn->privateData;
+ if (!privconn)
+ return 0;
+
virStorageDriverStatePtr storageState = privconn->storageState;
privconn->storageState = NULL;
+ if (!storageState)
+ return 0;
+
parallelsStorageLock(storageState);
virStoragePoolObjListFree(&privconn->pools);
VIR_FREE(storageState->configDir);