]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: Cleanup matchFCHostToSCSIHost
authorJohn Ferlan <jferlan@redhat.com>
Mon, 20 Feb 2017 18:59:36 +0000 (13:59 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Tue, 21 Feb 2017 15:52:20 +0000 (10:52 -0500)
Rather than the inlined VIR_FREE's, use a cleanup: label... Fixes an
issue introduced by 03346def where @name was free'd before usage in
a virAsprintf to format scsi_host_name.

src/conf/storage_conf.c

index 0e9a51f80e3d21255a00064fd5c5774d4d4d50aa..a52eeba07488cd5fd52543b9b6770f9e4a6275bd 100644 (file)
@@ -2341,6 +2341,7 @@ matchFCHostToSCSIHost(virConnectPtr conn,
                       virStoragePoolSourceAdapter fc_adapter,
                       unsigned int scsi_hostnum)
 {
+    bool ret = false;
     char *name = NULL;
     char *scsi_host_name = NULL;
     char *parent_name = NULL;
@@ -2362,10 +2363,9 @@ matchFCHostToSCSIHost(virConnectPtr conn,
          * matches our scsi_hostnum
          */
         if (virStorageIsSameHostnum(name, scsi_hostnum)) {
-            VIR_FREE(name);
-            return true;
+            ret = true;
+            goto cleanup;
         }
-        VIR_FREE(name);
 
         /* We weren't provided a parent, so we have to query the node
          * device driver in order to ascertain the parent of the vHBA.
@@ -2373,23 +2373,18 @@ matchFCHostToSCSIHost(virConnectPtr conn,
          * have a match.
          */
         if (conn && !fc_adapter.data.fchost.parent) {
-            if (virAsprintf(&scsi_host_name, "scsi_%s", name) < 0) {
-                VIR_FREE(name);
-                return false;
-            }
+            if (virAsprintf(&scsi_host_name, "scsi_%s", name) < 0)
+                goto cleanup;
             if ((parent_name = virNodeDeviceGetParentName(conn,
                                                           scsi_host_name))) {
-                VIR_FREE(scsi_host_name);
                 if (virStorageIsSameHostnum(parent_name, scsi_hostnum)) {
-                    VIR_FREE(parent_name);
-                    return true;
+                    ret = true;
+                    goto cleanup;
                 }
-                VIR_FREE(parent_name);
             } else {
                 /* Throw away the error and fall through */
                 virResetLastError();
                 VIR_DEBUG("Could not determine parent vHBA");
-                VIR_FREE(scsi_host_name);
             }
         }
     }
@@ -2401,7 +2396,12 @@ matchFCHostToSCSIHost(virConnectPtr conn,
      *     conflict with an existing scsi_host definition, but there's no
      *     way to know that now.
      */
-    return false;
+
+ cleanup:
+    VIR_FREE(name);
+    VIR_FREE(parent_name);
+    VIR_FREE(scsi_host_name);
+    return ret;
 }
 
 static bool