]> xenbits.xensource.com Git - libvirt.git/commitdiff
parallels: Cleanup partly opened drivers on connect open failure
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 26 Feb 2015 16:13:53 +0000 (17:13 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 5 Mar 2015 07:38:21 +0000 (08:38 +0100)
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>
src/parallels/parallels_driver.c
src/parallels/parallels_network.c
src/parallels/parallels_storage.c

index c9338b5be0992fdbf22c87e6345a5c58785fe53a..650b79051e9665398ebbaa2c7a78fb7cafa6b6ad 100644 (file)
@@ -264,8 +264,10 @@ parallelsConnectOpen(virConnectPtr conn,
 
     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;
 }
@@ -275,6 +277,9 @@ parallelsConnectClose(virConnectPtr conn)
 {
     parallelsConnPtr privconn = conn->privateData;
 
+    if (!privconn)
+        return 0;
+
     parallelsNetworkClose(conn);
     parallelsStorageClose(conn);
 
index a347a094134fa51c911382ab660e3b872195c7b2..e1c6040deb3932ab9bd9194c77529344a6ed214f 100644 (file)
@@ -344,6 +344,10 @@ parallelsNetworkOpen(virConnectPtr conn,
 int parallelsNetworkClose(virConnectPtr conn)
 {
     parallelsConnPtr privconn = conn->privateData;
+
+    if (!privconn)
+        return 0;
+
     parallelsDriverLock(privconn);
     virNetworkObjListFree(privconn->networks);
     VIR_FREE(privconn->networks);
index a6980a477ac72933aab244246e0de6628c05e72a..6397601aa9e8ff7ca0c8ceeaedba63fabc02b1f9 100644 (file)
@@ -72,9 +72,15 @@ parallelsStorageClose(virConnectPtr conn)
 {
     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);