]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Resolve Coverity RESOURCE_LEAK
authorJohn Ferlan <jferlan@redhat.com>
Mon, 18 May 2015 13:16:53 +0000 (09:16 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Tue, 26 May 2015 10:36:09 +0000 (06:36 -0400)
Recent changes to the -M/--machine processing code in qemuParseCommandLine
caused Coverity to determine there was a possible resource leak with how
the 'list' is managed. Rather than try to add virStringFreeList calls
everywhere - just promote list to the top of the variables and free it
within the error processing code. Also required a couple of other tweaks
in order to avoid double free's.

src/qemu/qemu_command.c

index 81e89fc7f3882f7aeec737292df0cd0fd59800c7..d8ce511d1cce1851442100dba62784e6f6ebae00 100644 (file)
@@ -12412,6 +12412,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
     size_t i;
     bool nographics = false;
     bool fullscreen = false;
+    char **list = NULL;
     char *path;
     size_t nnics = 0;
     const char **nics = NULL;
@@ -12879,7 +12880,6 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
                 VIR_FREE(def->name);
         } else if (STREQ(arg, "-M") ||
                    STREQ(arg, "-machine")) {
-            char **list;
             char *param;
             size_t j = 0;
 
@@ -12894,10 +12894,8 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
             if (STRPREFIX(param, "type="))
                 param += strlen("type=");
             if (!strchr(param, '=')) {
-                if (VIR_STRDUP(def->os.machine, param) < 0) {
-                    virStringFreeList(list);
+                if (VIR_STRDUP(def->os.machine, param) < 0)
                     goto error;
-                }
                 j++;
             }
 
@@ -12942,6 +12940,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
                 }
             }
             virStringFreeList(list);
+            list = NULL;
         } else if (STREQ(arg, "-serial")) {
             WANT_VALUE();
             if (STRNEQ(val, "none")) {
@@ -13415,6 +13414,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
     virDomainDiskDefFree(disk);
     qemuDomainCmdlineDefFree(cmd);
     virDomainDefFree(def);
+    virStringFreeList(list);
     VIR_FREE(nics);
     if (monConfig) {
         virDomainChrSourceDefFree(*monConfig);