summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2024-10-17 14:43:19 +0200
committerGitHub <noreply@github.com>2024-10-17 14:43:19 +0200
commit49fd31df58a707e7d748581a6986164132460cf2 (patch)
treefc5ab3f8da2aa54fc09f482558f80b793cc37115
parentMerge pull request #34795 from YHNdnzj/bump-kernel-baseline-5.4 (diff)
parentpid1: close fds we receive via sd_notify() and cannot make use of asynchronously (diff)
downloadsystemd-49fd31df58a707e7d748581a6986164132460cf2.tar.xz
systemd-49fd31df58a707e7d748581a6986164132460cf2.zip
Merge pull request #34801 from poettering/async-sd-notify-close
pid1: close unexpected fds received via sd_notify() asyncronously
-rw-r--r--src/core/bpf-restrict-ifaces.c2
-rw-r--r--src/core/bpf-socket-bind.c2
-rw-r--r--src/core/manager.c2
-rw-r--r--src/nspawn/nspawn.c2
-rw-r--r--src/shared/fdset.c16
-rw-r--r--src/shared/fdset.h5
6 files changed, 21 insertions, 8 deletions
diff --git a/src/core/bpf-restrict-ifaces.c b/src/core/bpf-restrict-ifaces.c
index a39f4895f2..af49abd677 100644
--- a/src/core/bpf-restrict-ifaces.c
+++ b/src/core/bpf-restrict-ifaces.c
@@ -159,7 +159,7 @@ int bpf_restrict_ifaces_install(Unit *u) {
return 0;
r = restrict_ifaces_install_impl(u);
- fdset_close(crt->initial_restrict_ifaces_link_fds);
+ fdset_close(crt->initial_restrict_ifaces_link_fds, /* async= */ false);
return r;
}
diff --git a/src/core/bpf-socket-bind.c b/src/core/bpf-socket-bind.c
index 2a1a0278d5..8853f3eecc 100644
--- a/src/core/bpf-socket-bind.c
+++ b/src/core/bpf-socket-bind.c
@@ -229,7 +229,7 @@ int bpf_socket_bind_install(Unit *u) {
return 0;
r = socket_bind_install_impl(u);
- fdset_close(crt->initial_socket_bind_link_fds);
+ fdset_close(crt->initial_socket_bind_link_fds, /* async= */ false);
return r;
}
diff --git a/src/core/manager.c b/src/core/manager.c
index b9ea79a7ad..8e033c69c4 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -2793,7 +2793,7 @@ static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t
}
}
- _cleanup_fdset_free_ FDSet *fds = NULL;
+ _cleanup_(fdset_free_asyncp) FDSet *fds = NULL;
if (n_fds > 0) {
assert(fd_array);
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index 70ce4e6d79..8fc58665e4 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -5267,7 +5267,7 @@ static int run_container(
barrier_set_role(&barrier, BARRIER_PARENT);
- fdset_close(fds);
+ fdset_close(fds, /* async= */ false);
fd_inner_socket_pair[1] = safe_close(fd_inner_socket_pair[1]);
fd_outer_socket_pair[1] = safe_close(fd_outer_socket_pair[1]);
diff --git a/src/shared/fdset.c b/src/shared/fdset.c
index cb5a69ef22..b3d3cfa784 100644
--- a/src/shared/fdset.c
+++ b/src/shared/fdset.c
@@ -8,6 +8,7 @@
#include "sd-daemon.h"
#include "alloc-util.h"
+#include "async.h"
#include "dirent-util.h"
#include "fd-util.h"
#include "fdset.h"
@@ -51,7 +52,7 @@ int fdset_new_array(FDSet **ret, const int fds[], size_t n_fds) {
return 0;
}
-void fdset_close(FDSet *s) {
+void fdset_close(FDSet *s, bool async) {
void *p;
while ((p = set_steal_first(MAKE_SET(s)))) {
@@ -72,12 +73,21 @@ void fdset_close(FDSet *s) {
log_debug("Closing set fd %i (%s)", fd, strna(path));
}
- (void) close(fd);
+ if (async)
+ (void) asynchronous_close(fd);
+ else
+ (void) close(fd);
}
}
FDSet* fdset_free(FDSet *s) {
- fdset_close(s);
+ fdset_close(s, /* async= */ false);
+ set_free(MAKE_SET(s));
+ return NULL;
+}
+
+FDSet* fdset_free_async(FDSet *s) {
+ fdset_close(s, /* async= */ true);
set_free(MAKE_SET(s));
return NULL;
}
diff --git a/src/shared/fdset.h b/src/shared/fdset.h
index 70a764fb4d..3e69d32146 100644
--- a/src/shared/fdset.h
+++ b/src/shared/fdset.h
@@ -11,6 +11,7 @@ typedef struct FDSet FDSet;
FDSet* fdset_new(void);
FDSet* fdset_free(FDSet *s);
+FDSet* fdset_free_async(FDSet *s);
int fdset_put(FDSet *s, int fd);
int fdset_consume(FDSet *s, int fd);
@@ -36,7 +37,7 @@ int fdset_iterate(FDSet *s, Iterator *i);
int fdset_steal_first(FDSet *fds);
-void fdset_close(FDSet *fds);
+void fdset_close(FDSet *fds, bool async);
#define _FDSET_FOREACH(fd, fds, i) \
for (Iterator i = ITERATOR_FIRST; ((fd) = fdset_iterate((fds), &i)) >= 0; )
@@ -45,3 +46,5 @@ void fdset_close(FDSet *fds);
DEFINE_TRIVIAL_CLEANUP_FUNC(FDSet*, fdset_free);
#define _cleanup_fdset_free_ _cleanup_(fdset_freep)
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(FDSet*, fdset_free_async);