]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: ensure safe{read,write,zero} return is checked
authorEric Blake <eblake@redhat.com>
Tue, 2 Mar 2010 16:35:01 +0000 (09:35 -0700)
committerEric Blake <eblake@redhat.com>
Thu, 15 Apr 2010 17:40:08 +0000 (11:40 -0600)
Based on a warning from coverity.  The safe* functions
guarantee complete transactions on success, but don't guarantee
freedom from failure.

* src/util/util.h (saferead, safewrite, safezero): Add
ATTRIBUTE_RETURN_CHECK.
* src/remote/remote_driver.c (remoteIO, remoteIOEventLoop): Ignore
some failures.
(remoteIOReadBuffer): Adjust error messages on read failure.
* daemon/event.c (virEventHandleWakeup): Ignore read failure.

daemon/event.c
src/remote/remote_driver.c
src/util/util.h

index 2218a3e489de32edf27955c96f8ae96a637f7134..69714091dc948eb3393d6e91c78fa017c8735ac8 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * event.c: event loop for monitoring file handles
  *
+ * Copyright (C) 2007, 2010 Red Hat, Inc.
  * Copyright (C) 2007 Daniel P. Berrange
- * Copyright (C) 2007 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -35,6 +35,7 @@
 #include "event.h"
 #include "memory.h"
 #include "util.h"
+#include "ignore-value.h"
 
 #define EVENT_DEBUG(fmt, ...) DEBUG(fmt, __VA_ARGS__)
 
@@ -630,7 +631,7 @@ static void virEventHandleWakeup(int watch ATTRIBUTE_UNUSED,
 {
     char c;
     virEventLock();
-    saferead(fd, &c, sizeof(c));
+    ignore_value(saferead(fd, &c, sizeof(c)));
     virEventUnlock();
 }
 
index f514e1d5dc5919973e6668d2e346dc9d945c574d..ebcfcd86b8fc9c1535dd9d5bf46fdd8a73a2a636 100644 (file)
@@ -8877,7 +8877,11 @@ remoteIOReadBuffer(struct private_data *priv,
 
                 char errout[1024] = "\0";
                 if (priv->errfd != -1) {
-                    saferead(priv->errfd, errout, sizeof(errout));
+                    if (saferead(priv->errfd, errout, sizeof(errout)) < 0) {
+                        virReportSystemError(errno, "%s",
+                                             _("cannot recv data"));
+                        return -1;
+                    }
                 }
 
                 virReportSystemError(errno,
@@ -8886,7 +8890,12 @@ remoteIOReadBuffer(struct private_data *priv,
             } else {
                 char errout[1024] = "\0";
                 if (priv->errfd != -1) {
-                    saferead(priv->errfd, errout, sizeof(errout));
+                    if (saferead(priv->errfd, errout, sizeof(errout)) < 0) {
+                        remoteError(VIR_ERR_SYSTEM_ERROR,
+                                    _("server closed connection: %s"),
+                                    virStrerror(errno, errout, sizeof errout));
+                        return -1;
+                    }
                 }
 
                 remoteError(VIR_ERR_SYSTEM_ERROR,
@@ -9499,7 +9508,7 @@ remoteIOEventLoop(virConnectPtr conn,
         sigaddset (&blockedsigs, SIGWINCH);
         sigaddset (&blockedsigs, SIGCHLD);
         sigaddset (&blockedsigs, SIGPIPE);
-        ignore_value (pthread_sigmask(SIG_BLOCK, &blockedsigs, &oldmask));
+        ignore_value(pthread_sigmask(SIG_BLOCK, &blockedsigs, &oldmask));
 #endif
 
     repoll:
@@ -9508,14 +9517,15 @@ remoteIOEventLoop(virConnectPtr conn,
             goto repoll;
 
 #ifdef HAVE_PTHREAD_H
-        ignore_value (pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
+        ignore_value(pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
 #endif
 
         remoteDriverLock(priv);
 
         if (fds[1].revents) {
             DEBUG0("Woken up from poll by other thread");
-            saferead(priv->wakeupReadFD, &ignore, sizeof(ignore));
+            ignore_value(saferead(priv->wakeupReadFD, &ignore,
+                                  sizeof(ignore)));
         }
 
         if (ret < 0) {
@@ -9659,7 +9669,7 @@ remoteIO(virConnectPtr conn,
             priv->waitDispatch = thiscall;
 
         /* Force other thread to wakup from poll */
-        safewrite(priv->wakeupSendFD, &ignore, sizeof(ignore));
+        ignore_value(safewrite(priv->wakeupSendFD, &ignore, sizeof(ignore)));
 
         DEBUG("Going to sleep %d %p %p", thiscall->proc_nr, priv->waitDispatch, thiscall);
         /* Go to sleep while other thread is working... */
index c25611763ea0440647ff5024138c9a4e02861f2d..4f0b23300e44e75b49f32cd552757b38cbaa3d73 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * utils.h: common, generic utility functions
  *
+ * Copyright (C) 2010 Red Hat, Inc.
  * Copyright (C) 2006, 2007 Binary Karma
  * Copyright (C) 2006 Shuveb Hussain
  *
 # include <sys/select.h>
 # include <sys/types.h>
 
-int saferead(int fd, void *buf, size_t count);
-ssize_t safewrite(int fd, const void *buf, size_t count);
-int safezero(int fd, int flags, off_t offset, off_t len);
+int saferead(int fd, void *buf, size_t count) ATTRIBUTE_RETURN_CHECK;
+ssize_t safewrite(int fd, const void *buf, size_t count)
+    ATTRIBUTE_RETURN_CHECK;
+int safezero(int fd, int flags, off_t offset, off_t len)
+    ATTRIBUTE_RETURN_CHECK;
 
 enum {
     VIR_EXEC_NONE   = 0,