]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Fix error reporting when poll returns POLLHUP/POLLERR
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 18 Apr 2017 15:57:06 +0000 (16:57 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 20 Apr 2017 09:15:46 +0000 (10:15 +0100)
In the RPC client event loop code, if poll() returns only a POLLHUP
or POLLERR status, then we end up reporting a bogus error message:

  error: failed to connect to the hypervisor
  error: An error occurred, but the cause is unknown

We do actually report an error, but we virNetClientMarkClose method
has already captured the error status before we report it, so the
real error gets thrown away. The key fix is to report the error
before calling virNetClientMarkClose(). In changing this, we also
split out reporting of POLLHUP vs POLLERR to make any future bugs
easier to diagnose.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/rpc/virnetclient.c

index 5174614df7012b61ccadb7c62af61f3e18bf41df..c9597479494dd13cd4627b8b8dc4347b23491d8c 100644 (file)
@@ -1743,10 +1743,16 @@ static int virNetClientIOEventLoop(virNetClientPtr client,
         if (error)
             goto error;
 
-        if (fds[0].revents & (POLLHUP | POLLERR)) {
+        if (fds[0].revents & POLLHUP) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("received hangup event on socket"));
             virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_EOF);
+            goto error;
+        }
+        if (fds[0].revents & POLLERR) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("received hangup / error event on socket"));
+                           _("received error event on socket"));
+            virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
             goto error;
         }
     }