提交 1f6fc519 编写于 作者: J Jim Meyering

lxc_controller.c: don't ignore failed "accept"

* src/lxc/lxc_controller.c (ignorable_epoll_accept_errno): New function.
(lxcControllerMain): Handle a failed accept carefully:
most errno values indicate legitimate failure and must be fatal.
However, ignore a special case: that in which an incoming client quits
between the poll() indicating its presence, and our accept() which
is trying to process it.
上级 348c6fc0
...@@ -269,6 +269,17 @@ typedef struct _lxcTtyForwardFd_t { ...@@ -269,6 +269,17 @@ typedef struct _lxcTtyForwardFd_t {
int active; int active;
} lxcTtyForwardFd_t; } lxcTtyForwardFd_t;
/* Return true if it is ok to ignore an accept-after-epoll syscall
that fails with the specified errno value. Else false. */
static bool
ignorable_epoll_accept_errno(int errnum)
{
return (errnum == EINVAL
|| errnum == ECONNABORTED
|| errnum == EAGAIN
|| errnum == EWOULDBLOCK);
}
/** /**
* lxcControllerMain * lxcControllerMain
* @monitor: server socket fd to accept client requests * @monitor: server socket fd to accept client requests
...@@ -350,6 +361,18 @@ static int lxcControllerMain(int monitor, ...@@ -350,6 +361,18 @@ static int lxcControllerMain(int monitor,
if (numEvents > 0) { if (numEvents > 0) {
if (epollEvent.data.fd == monitor) { if (epollEvent.data.fd == monitor) {
int fd = accept(monitor, NULL, 0); int fd = accept(monitor, NULL, 0);
if (fd < 0) {
/* First reflex may be simply to declare accept failure
to be a fatal error. However, accept may fail when
a client quits between the above epoll_wait and here.
That case is not fatal, but rather to be expected,
if not common, so ignore it. */
if (ignorable_epoll_accept_errno(errno))
continue;
virReportSystemError(errno, "%s",
_("accept(monitor,...) failed"));
goto cleanup;
}
if (client != -1) { /* Already connected, so kick new one out */ if (client != -1) { /* Already connected, so kick new one out */
close(fd); close(fd);
continue; continue;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册