daemon: Keep Coverity happy by ignoring some return values.
[libguestfs.git] / daemon / guestfsd.c
index 1c695eb..eb1e82b 100644 (file)
@@ -103,7 +103,7 @@ winsock_init (void)
 
 /* Location to mount root device. */
 const char *sysroot = "/sysroot"; /* No trailing slash. */
-int sysroot_len = 8;
+size_t sysroot_len = 8;
 
 /* If set (the default), do 'umount-all' when performing autosync. */
 int autosync_umount = 1;
@@ -429,6 +429,7 @@ add_string (char ***argv, int *size, int *alloc, const char *str)
     if (new_str == NULL) {
       reply_with_perror ("strdup");
       free_strings (*argv);
+      return -1;
     }
   } else
     new_str = NULL;
@@ -679,6 +680,7 @@ commandrvf (char **stdoutput, char **stderror, int flags,
   }
 
   if (pid == 0) {              /* Child process running the command. */
+    signal (SIGALRM, SIG_DFL);
     signal (SIGPIPE, SIG_DFL);
     close (0);
     if (flag_copy_stdin) {
@@ -687,7 +689,7 @@ commandrvf (char **stdoutput, char **stderror, int flags,
       close (stdin_fd[1]);
     } else {
       /* Set stdin to /dev/null (ignore failure) */
-      open ("/dev/null", O_RDONLY);
+      ignore_value (open ("/dev/null", O_RDONLY));
     }
     close (so_fd[0]);
     close (se_fd[0]);
@@ -777,8 +779,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);