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: