Set the O_CLOEXEC flag on the accept, useful to avoid an FD leak in the
master process, since it reexecutes itself during a reload
---
 src/listener.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/listener.c b/src/listener.c
index fb2306927..a730b1832 100644
--- a/src/listener.c
+++ b/src/listener.c
@@ -545,7 +545,7 @@ void listener_accept(int fd)
                /* with sockpair@ we don't want to do an accept */
                if (unlikely(l->addr.ss_family == AF_CUST_SOCKPAIR)) {
                        if ((cfd = recv_fd_uxst(fd)) != -1)
-                               fcntl(cfd, F_SETFL, O_NONBLOCK);
+                               fcntl(cfd, F_SETFL, O_NONBLOCK|O_CLOEXEC);
                } else
 
 #ifdef USE_ACCEPT4
@@ -553,12 +553,12 @@ void listener_accept(int fd)
                 * fallback to the legacy accept() + fcntl().
                 */
                if (unlikely(accept4_broken ||
-                       ((cfd = accept4(fd, (struct sockaddr *)&addr, &laddr, 
SOCK_NONBLOCK)) == -1 &&
+                       ((cfd = accept4(fd, (struct sockaddr *)&addr, &laddr, 
SOCK_NONBLOCK|SOCK_CLOEXEC)) == -1 &&
                        (errno == ENOSYS || errno == EINVAL || errno == EBADF) 
&&
                        (accept4_broken = 1))))
 #endif
                        if ((cfd = accept(fd, (struct sockaddr *)&addr, 
&laddr)) != -1)
-                               fcntl(cfd, F_SETFL, O_NONBLOCK);
+                               fcntl(cfd, F_SETFL, O_NONBLOCK|O_CLOEXEC);
 
                if (unlikely(cfd == -1)) {
                        switch (errno) {
-- 
2.16.4


Reply via email to