mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 22:25:25 +00:00
Fix misc bugs in virCommandPtr
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.
This commit is contained in:
parent
2737b6c20b
commit
2a2a00eb69
@ -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++;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user