]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix misc bugs in virCommandPtr
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 8 Mar 2011 18:06:09 +0000 (18:06 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 15 Mar 2011 15:26:35 +0000 (15:26 +0000)
The virCommandNewArgs() method would free the virCommandPtr
if it failed to add the args. This meant errors reported in
virCommandAddArgSet() were lost. Simply removing the check
for errors from the constructor means they can be reported
correctly later

The virCommandAddEnvPassCommon() method failed to check for
errors before reallocating the cmd->env array, causing a
potential SEGV if cmd was NULL

The virCommandAddArgSet() method needs to validate that at
least 1 element in 'val's parameter is non-NULL, otherwise
code like

    cmd = virCommandNew(binary)
    virCommandAddAtg(cmd, "foo")

Would end up trying todo  execve("foo"), if binary was
NULL.

src/util/command.c

index ff2bd4617db3f46c74744152b494562789daf74a..22f350b656802577b86d1d6c0c8f42cefc20e0c4 100644 (file)
@@ -109,11 +109,6 @@ virCommandNewArgs(const char *const*args)
 
     virCommandAddArgSet(cmd, args);
 
-    if (cmd->has_error) {
-        virCommandFree(cmd);
-        return NULL;
-    }
-
     return cmd;
 }
 
@@ -362,6 +357,9 @@ virCommandAddEnvPass(virCommandPtr cmd, const char *name)
 void
 virCommandAddEnvPassCommon(virCommandPtr cmd)
 {
+    if (!cmd || cmd->has_error)
+        return;
+
     /* Attempt to Pre-allocate; allocation failure will be detected
      * later during virCommandAdd*.  */
     ignore_value(VIR_RESIZE_N(cmd->env, cmd->maxenv, cmd->nenv, 9));
@@ -478,6 +476,11 @@ virCommandAddArgSet(virCommandPtr cmd, const char *const*vals)
     if (!cmd || cmd->has_error)
         return;
 
+    if (vals[0] == NULL) {
+        cmd->has_error = EINVAL;
+        return;
+    }
+
     while (vals[narg] != NULL)
         narg++;