提交 06b9c5b9 编写于 作者: M Michal Privoznik

virCommand: Properly handle POLLHUP

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.
上级 524ba58b
...@@ -1620,16 +1620,19 @@ virCommandProcessIO(virCommandPtr cmd) ...@@ -1620,16 +1620,19 @@ virCommandProcessIO(virCommandPtr cmd)
if (infd != -1) { if (infd != -1) {
fds[nfds].fd = infd; fds[nfds].fd = infd;
fds[nfds].events = POLLOUT; fds[nfds].events = POLLOUT;
fds[nfds].revents = 0;
nfds++; nfds++;
} }
if (outfd != -1) { if (outfd != -1) {
fds[nfds].fd = outfd; fds[nfds].fd = outfd;
fds[nfds].events = POLLIN; fds[nfds].events = POLLIN;
fds[nfds].revents = 0;
nfds++; nfds++;
} }
if (errfd != -1) { if (errfd != -1) {
fds[nfds].fd = errfd; fds[nfds].fd = errfd;
fds[nfds].events = POLLIN; fds[nfds].events = POLLIN;
fds[nfds].revents = 0;
nfds++; nfds++;
} }
...@@ -1645,8 +1648,8 @@ virCommandProcessIO(virCommandPtr cmd) ...@@ -1645,8 +1648,8 @@ virCommandProcessIO(virCommandPtr cmd)
} }
for (i = 0; i < nfds ; i++) { for (i = 0; i < nfds ; i++) {
if (fds[i].fd == errfd || if (fds[i].revents & POLLIN &&
fds[i].fd == outfd) { (fds[i].fd == errfd || fds[i].fd == outfd)) {
char data[1024]; char data[1024];
char **buf; char **buf;
size_t *len; size_t *len;
...@@ -1684,7 +1687,10 @@ virCommandProcessIO(virCommandPtr cmd) ...@@ -1684,7 +1687,10 @@ virCommandProcessIO(virCommandPtr cmd)
memcpy(*buf + *len, data, done); memcpy(*buf + *len, data, done);
*len += done; *len += done;
} }
} else { }
if (fds[i].revents & POLLOUT &&
fds[i].fd == infd) {
int done; int done;
/* Coverity 5.3.0 can't see that we only get here if /* Coverity 5.3.0 can't see that we only get here if
...@@ -1710,6 +1716,18 @@ virCommandProcessIO(virCommandPtr cmd) ...@@ -1710,6 +1716,18 @@ virCommandProcessIO(virCommandPtr cmd)
} }
} }
if (fds[i].revents & (POLLHUP | POLLERR)) {
if (fds[i].fd == errfd) {
VIR_DEBUG("hangup on stderr");
errfd = -1;
} else if (fds[i].fd == outfd) {
VIR_DEBUG("hangup on stdout");
outfd = -1;
} else {
VIR_DEBUG("hangup on stdin");
infd = -1;
}
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册