From 1eead503da2617be8338ac2ff8e32a295991d369 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sat, 28 Mar 2009 19:43:06 +0100 Subject: [PATCH] [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. --- src/ev_sepoll.c | 4 ++++ 1 file changed, 4 insertions(+) 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 -- 2.47.3