From d11c14a9817f6561a30d96d8faea126a4c811af8 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 4 Nov 2022 18:19:29 +0100 Subject: [PATCH] fd-util: make fd_in_set() (and thus close_all_fds()) handle invalidated fds in the array let's handle gracefully if fds in the specified array are already invalidated (i.e. negative). This is handy when putting together arrays on the fly. --- src/basic/fd-util.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index cee20a9a81..6ed04449bf 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -177,9 +177,13 @@ int fd_cloexec(int fd, bool cloexec) { _pure_ static bool fd_in_set(int fd, const int fdset[], size_t n_fdset) { assert(n_fdset == 0 || fdset); - for (size_t i = 0; i < n_fdset; i++) + for (size_t i = 0; i < n_fdset; i++) { + if (fdset[i] < 0) + continue; + if (fdset[i] == fd) return true; + } return false; } @@ -252,6 +256,10 @@ static int close_all_fds_special_case(const int except[], size_t n_except) { if (!have_close_range) return 0; + if (n_except == 1 && except[0] < 0) /* Minor optimization: if we only got one fd, and it's invalid, + * we got none */ + n_except = 0; + switch (n_except) { case 0: