On 03.01.2012 20:00, Eric Blake wrote: > On 01/03/2012 10:58 AM, Michal Privoznik wrote: >> It is a good practise to set revents to zero before doing any poll(). >> Moreover, we should check if event we waited for really occurred or >> if any of fds we were polling on didn't encountered hangup. > > Looks like this also solves: > > https://bugzilla.redhat.com/show_bug.cgi?id=770788 > >> --- >> src/util/command.c | 21 +++++++++++++++++---- >> 1 files changed, 17 insertions(+), 4 deletions(-) >> > Should we also be probing for POLLERR? (POLLNVAL shouldn't ever be > present, because it would indicate a bigger bug in our code). > > ACK - what you have is a strict improvement, even if we further decide > to check for POLLERR. > Thanks, pushed with this squashed in: diff --git a/src/util/command.c b/src/util/command.c index 9b553f0..bdaa88b 100644 --- a/src/util/command.c +++ b/src/util/command.c @@ -1687,7 +1687,10 @@ virCommandProcessIO(virCommandPtr cmd) memcpy(*buf + *len, data, done); *len += done; } - } else if (fds[i].revents & POLLOUT) { + } + + if (fds[i].revents & POLLOUT && + fds[i].fd == infd) { int done; /* Coverity 5.3.0 can't see that we only get here if @@ -1711,7 +1714,9 @@ virCommandProcessIO(virCommandPtr cmd) VIR_DEBUG("ignoring failed close on fd %d", tmpfd); } } - } else if (fds[i].revents & POLLHUP) { + } + + if (fds[i].revents & (POLLHUP | POLLERR)) { if (fds[i].fd == errfd) { VIR_DEBUG("hangup on stderr"); errfd = -1; -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list