]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Fix the memory leak
authorOsier Yang <jyang@redhat.com>
Thu, 23 Jan 2014 10:18:36 +0000 (18:18 +0800)
committerOsier Yang <jyang@redhat.com>
Thu, 23 Jan 2014 13:39:05 +0000 (21:39 +0800)
The return value of virGetFCHostNameByWWN is a strdup'ed string.
Also add comments to declare that the caller should take care of
freeing it.

src/storage/storage_backend_scsi.c
src/util/virutil.c

index fce2bae481e32d933d12dec0126e74f4705acd32..b38e5301e643f1022816db1057a12f1947d40953 100644 (file)
@@ -668,6 +668,8 @@ static int
 deleteVport(virStoragePoolSourceAdapter adapter)
 {
     unsigned int parent_host;
+    char *name = NULL;
+    int ret = -1;
 
     if (adapter.type != VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
         return 0;
@@ -680,18 +682,21 @@ deleteVport(virStoragePoolSourceAdapter adapter)
     if (!adapter.data.fchost.parent)
         return 0;
 
-    if (!(virGetFCHostNameByWWN(NULL, adapter.data.fchost.wwnn,
-                                adapter.data.fchost.wwpn)))
+    if (!(name = virGetFCHostNameByWWN(NULL, adapter.data.fchost.wwnn,
+                                       adapter.data.fchost.wwpn)))
         return -1;
 
     if (getHostNumber(adapter.data.fchost.parent, &parent_host) < 0)
-        return -1;
+        goto cleanup;
 
     if (virManageVport(parent_host, adapter.data.fchost.wwpn,
                        adapter.data.fchost.wwnn, VPORT_DELETE) < 0)
-        return -1;
+        goto cleanup;
 
-    return 0;
+    ret = 0;
+cleanup:
+    VIR_FREE(name);
+    return ret;
 }
 
 
index 87cc2e7515143d68774972808507dc15f3774ed4..7a2fbb0561484463ca26ecdaa11fbf0869cb5bc4 100644 (file)
@@ -1820,7 +1820,10 @@ cleanup:
 /* virGetHostNameByWWN:
  *
  * Iterate over the sysfs tree to get FC host name (e.g. host5)
- * by wwnn,wwpn pair.
+ * by the provided "wwnn,wwpn" pair.
+ *
+ * Returns the FC host name which must be freed by the caller,
+ * or NULL on failure.
  */
 char *
 virGetFCHostNameByWWN(const char *sysfs_prefix,