From 91af764158ce079b33b8868b5138778f1f021004 Mon Sep 17 00:00:00 2001 From: des Date: Fri, 6 Oct 2006 15:37:32 +0000 Subject: [PATCH] On Linux 2.6.8 and older, epoll_ctl(EPOLL_CTL_DEL) requires a poll_event even though it is not used, and will return EFAULT if one is not provided. Also, instead of silently accepting EBADF from epoll_ctl(), check that sp->fd != -1 before calling vca_del(). This can happen in some cases where vca_pollsession() closes the session before returning. This way, we will still get an assertion failure if epoll_ctl() fails for some other (unexpected) reason. Thanks to airmax for his assistance in tracking this down. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1143 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache_acceptor_epoll.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache_acceptor_epoll.c b/varnish-cache/bin/varnishd/cache_acceptor_epoll.c index 3f795ca7..6a29422d 100644 --- a/varnish-cache/bin/varnishd/cache_acceptor_epoll.c +++ b/varnish-cache/bin/varnishd/cache_acceptor_epoll.c @@ -62,10 +62,8 @@ vca_add(int fd, void *data) static void vca_del(int fd) { - int i; - - i = epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL); - assert(i == 0 || errno == EBADF); + struct epoll_event ev = { 0, { 0 } }; + AZ(epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &ev)); } static void @@ -103,7 +101,8 @@ vca_main(void *arg) i = vca_pollsession(sp); if (i >= 0) { TAILQ_REMOVE(&sesshead, sp, list); - vca_del(sp->fd); + if (sp->fd != -1) + vca_del(sp->fd); if (i == 0) vca_handover(sp, i); else -- 2.39.5