From: Willy Tarreau Date: Sat, 28 Mar 2009 18:43:06 +0000 (+0100) Subject: [BUG] don't call epoll_ctl() on closed sockets X-Git-Tag: v1.3.17~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1eead503da2617be8338ac2ff8e32a295991d369;p=thirdparty%2Fhaproxy.git [BUG] don't call epoll_ctl() on closed sockets Some I/O callbacks are able to close their socket themselves. We want to check this before calling epoll_ctl(EPOLL_CTL_DEL), otherwise we get a -1 EBADF. Right now is looks like this could not cause any trouble but the case is racy enough to fix it. --- diff --git a/src/ev_sepoll.c b/src/ev_sepoll.c index feca9670cb..6a3c45913b 100644 --- a/src/ev_sepoll.c +++ b/src/ev_sepoll.c @@ -388,6 +388,10 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) fd_list[fd].e &= ~FD_EV_MASK_W; } + /* one callback might already have closed the fd by itself */ + if (fdtab[fd].state == FD_STCLOSE) + continue; + /* Now, we will adjust the event in the poll list. Indeed, it * is possible that an event which was previously in the poll * list now goes out, and the opposite is possible too. We can