[Libguestfs] [PATCH] Daemon: fix handling of errors from xread.
Richard W.M. Jones
rjones at redhat.com
Thu Sep 17 14:33:24 UTC 2009
This caused me to waste about 3 hours looking for a non-existent "data
corrupter" bug, which turned out to be the result of not checking the
return value of xread ...
Rich.
--
Richard Jones, Emerging Technologies, Red Hat http://et.redhat.com/~rjones
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into Xen guests.
http://et.redhat.com/~rjones/virt-p2v
-------------- next part --------------
>From 52ed541501934eb0464bdb8dff67a99d9ea0aaff Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones at trick.home.annexia.org>
Date: Thu, 17 Sep 2009 15:28:41 +0100
Subject: [PATCH 1/3] Daemon: fix handling of errors from xread.
If xread returns -1, that indicates a read error and we should exit.
Note that xread has already printed the error message.
---
daemon/proto.c | 18 +++++++++++-------
1 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/daemon/proto.c b/daemon/proto.c
index 817a995..037a9e0 100644
--- a/daemon/proto.c
+++ b/daemon/proto.c
@@ -62,7 +62,9 @@ main_loop (int _sock)
#endif
/* Read the length word. */
- xread (sock, lenbuf, 4);
+ if (xread (sock, lenbuf, 4) == -1)
+ exit (1);
+
xdrmem_create (&xdr, lenbuf, 4, XDR_DECODE);
xdr_uint32_t (&xdr, &len);
xdr_destroy (&xdr);
@@ -79,7 +81,8 @@ main_loop (int _sock)
continue;
}
- xread (sock, buf, len);
+ if (xread (sock, buf, len) == -1)
+ exit (1);
#if 0
if (verbose) {
@@ -307,7 +310,9 @@ receive_file (receive_cb cb, void *opaque)
for (;;) {
/* Read the length word. */
- xread (sock, lenbuf, 4);
+ if (xread (sock, lenbuf, 4) == -1)
+ exit (1);
+
xdrmem_create (&xdr, lenbuf, 4, XDR_DECODE);
xdr_uint32_t (&xdr, &len);
xdr_destroy (&xdr);
@@ -327,7 +332,8 @@ receive_file (receive_cb cb, void *opaque)
return -1;
}
- xread (sock, buf, len);
+ if (xread (sock, buf, len) == -1)
+ exit (1);
xdrmem_create (&xdr, buf, len, XDR_DECODE);
memset (&chunk, 0, sizeof chunk);
@@ -444,10 +450,8 @@ check_for_library_cancellation (void)
/* Read the message from the daemon. */
r = xread (sock, buf, sizeof buf);
- if (r == -1) {
- perror ("read");
+ if (r == -1)
return 0;
- }
xdrmem_create (&xdr, buf, sizeof buf, XDR_DECODE);
xdr_uint32_t (&xdr, &flag);
--
1.6.2.5
More information about the Libguestfs
mailing list