diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2011-06-09 09:39:54 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2011-06-13 14:12:23 +0100 |
commit | f0bea00cc5ccbcb275d74ed8b95a54b991a51503 (patch) | |
tree | 5296a131b2495d6a8cbc5c9e0f7047de5f742bc0 | |
parent | 4e8dda6ae5c6a4b2f3de42d109287f039e3a01b2 (diff) | |
download | libguestfs-f0bea00cc5ccbcb275d74ed8b95a54b991a51503.tar.gz libguestfs-f0bea00cc5ccbcb275d74ed8b95a54b991a51503.tar.xz libguestfs-f0bea00cc5ccbcb275d74ed8b95a54b991a51503.zip |
Coverity: Don't return freed pointers from command* along error path.
If the external command failed to run, we could free up the allocated
*stdoutput and *stderror pointers, but then return those freed
pointers to the caller. The caller usually tries to print and free
*stderror, so this is a serious error.
Instead, return *stdoutput as NULL, and *stderror pointing to a
generic error message.
(cherry picked from commit 29453a58d818df24c238d0a08a68886ebe4029dd)
-rw-r--r-- | daemon/guestfsd.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index 1fc3ce34..bb600905 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -793,8 +793,20 @@ commandrvf (char **stdoutput, char **stderror, int flags, perror ("select"); quit: - if (stdoutput) free (*stdoutput); - if (stderror) free (*stderror); + if (stdoutput) { + free (*stdoutput); + *stdoutput = NULL; + } + if (stderror) { + free (*stderror); + /* Need to return non-NULL *stderror here since most callers + * will try to print and then free the err string. + * Unfortunately recovery from strdup failure here is not + * possible. + */ + *stderror = strdup ("error running external command, " + "see debug output for details"); + } close (so_fd[0]); close (se_fd[0]); waitpid (pid, NULL, 0); |