From 234ac4e18db3a3acb7d8e792260ec0dabed7c36d Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 18 Apr 2017 16:57:06 +0100 Subject: [PATCH] Fix error reporting when poll returns POLLHUP/POLLERR 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 --- src/rpc/virnetclient.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index 5174614df7..c959747949 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -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; } } -- GitLab