From b8e602cb1bf5c818231e24b32084634edb2c8f85 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 22 Feb 2019 09:07:42 +0100 Subject: [PATCH] BUG/MINOR: fd: make sure my_closefrom() doesn't miss some FDs The optimized my_closefrom() implementation introduced with previous commit 9188ac60e ("MINOR: fd: implement an optimised my_closefrom() function") has a small bug causing it to miss some FDs at the end of each batch. The reason is that poll() returns the number of non-zero events, so it contains the size of the batch minus the FDs to close. Thus if the FDs to close are at the beginning they'll be seen but if they're at the end after all other closed ones, the returned count will not cover them. No backport is needed. --- src/fd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/fd.c b/src/fd.c index 33b8900f3b..7fdd56b40c 100644 --- a/src/fd.c +++ b/src/fd.c @@ -509,6 +509,9 @@ void my_closefrom(int start) break; } while (errno == EAGAIN || errno == EINTR || errno == ENOMEM); + if (ret) + ret = fd - start; + for (idx = 0; idx < ret; idx++) { if (poll_events[idx].revents & POLLNVAL) continue; /* already closed */ -- 2.39.5