summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2011-06-09 09:39:54 +0100
committerRichard W.M. Jones <rjones@redhat.com>2011-06-13 14:12:23 +0100
commitf0bea00cc5ccbcb275d74ed8b95a54b991a51503 (patch)
tree5296a131b2495d6a8cbc5c9e0f7047de5f742bc0
parent4e8dda6ae5c6a4b2f3de42d109287f039e3a01b2 (diff)
downloadlibguestfs-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.c16
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);