]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Fix leak of command line args in qemuParseCommandLine
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 24 Sep 2013 15:38:26 +0000 (16:38 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 25 Sep 2013 14:49:28 +0000 (15:49 +0100)
If qemuParseCommandLine finds an arg it does not understand
it adds it to the QEMU passthrough custom arg list. If the
qemuParseCommandLine method hits an error for any reason
though, it just does 'VIR_FREE(cmd)' on the custom arg list.
This means all actual args / env vars are leaked. Introduce
a qemuDomainCmdlineDefFree method to be used for cleanup.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_conf.c
src/qemu/qemu_conf.h
src/qemu/qemu_domain.c

index 1f9a999760635df35b5ac0d9c8410d8007a9cbf1..ba102f41749c9ad90f991b7e283ee79d3a83071b 100644 (file)
@@ -11963,13 +11963,13 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
         def->namespaceData = cmd;
     }
     else
-        VIR_FREE(cmd);
+        qemuDomainCmdlineDefFree(cmd);
 
     return def;
 
 error:
     virDomainDiskDefFree(disk);
-    VIR_FREE(cmd);
+    qemuDomainCmdlineDefFree(cmd);
     virDomainDefFree(def);
     VIR_FREE(nics);
     if (monConfig) {
index 1f57f7280de2bf7602817f1edfd0571aa8a77441..1a41caf93f631d6dbe1434943603dec58353eb72 100644 (file)
@@ -87,6 +87,24 @@ qemuDriverUnlock(virQEMUDriverPtr driver)
     virMutexUnlock(&driver->lock);
 }
 
+void qemuDomainCmdlineDefFree(qemuDomainCmdlineDefPtr def)
+{
+    size_t i;
+
+    if (!def)
+        return;
+
+    for (i = 0; i < def->num_args; i++)
+        VIR_FREE(def->args[i]);
+    for (i = 0; i < def->num_env; i++) {
+        VIR_FREE(def->env_name[i]);
+        VIR_FREE(def->env_value[i]);
+    }
+    VIR_FREE(def->args);
+    VIR_FREE(def->env_name);
+    VIR_FREE(def->env_value);
+    VIR_FREE(def);
+}
 
 virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged)
 {
index 206f2c614000f9d6eb2c1dd9c6a25aea67ac8def..da29a2aa2aaf6ca2d6eb5c08529d7c1f6e30377d 100644 (file)
@@ -247,6 +247,8 @@ struct _qemuDomainCmdlineDef {
 # define QEMUD_MIGRATION_NUM_PORTS 64
 
 
+void qemuDomainCmdlineDefFree(qemuDomainCmdlineDefPtr def);
+
 virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged);
 
 int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
index f2cca70e3208d82e9487327e858b6789d1192c64..968e323210b41d2903811f5ddf884607d05e3b06 100644 (file)
@@ -535,21 +535,8 @@ static void
 qemuDomainDefNamespaceFree(void *nsdata)
 {
     qemuDomainCmdlineDefPtr cmd = nsdata;
-    size_t i;
-
-    if (!cmd)
-        return;
 
-    for (i = 0; i < cmd->num_args; i++)
-        VIR_FREE(cmd->args[i]);
-    for (i = 0; i < cmd->num_env; i++) {
-        VIR_FREE(cmd->env_name[i]);
-        VIR_FREE(cmd->env_value[i]);
-    }
-    VIR_FREE(cmd->args);
-    VIR_FREE(cmd->env_name);
-    VIR_FREE(cmd->env_value);
-    VIR_FREE(cmd);
+    qemuDomainCmdlineDefFree(cmd);
 }
 
 static int