From: Olivier Houchard Date: Tue, 25 Feb 2025 11:01:40 +0000 (+0100) Subject: MEDIUM: epoll: Make sure we can add a new event X-Git-Tag: v3.2-dev7~62 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=752c5cba5dc068a472bce344586e1b8c54021367;p=thirdparty%2Fhaproxy.git MEDIUM: epoll: Make sure we can add a new event Check that the call to epoll_ctl() succeeds, and if it does not, if we're adding a new event and it fails with EEXIST, then delete and re-add the event. There are a few cases where we may already have events for a fd. If epoll_ctl() fails for any reason, use BUG_ON to make sure we immediately crash, as this should not happen. --- diff --git a/src/ev_epoll.c b/src/ev_epoll.c index 21770aa35..e0dd52158 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -154,7 +154,14 @@ static void _update_fd(int fd) done: ev.events &= ~epoll_mask; ev.data.u64 = ((u64)fdtab[fd].generation << 32) + fd; - epoll_ctl(epoll_fd[tid], opcode, fd, &ev); + if (epoll_ctl(epoll_fd[tid], opcode, fd, &ev) != 0) { + if (opcode == EPOLL_CTL_ADD && errno == EEXIST) { + BUG_ON(epoll_ctl(epoll_fd[tid], EPOLL_CTL_DEL, fd, &ev) != 0); + BUG_ON(epoll_ctl(epoll_fd[tid], EPOLL_CTL_ADD, fd, &ev) != 0); + } else { + BUG_ON(1, "epoll_ctl() failed when it should not"); + } + } } /*