1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-22 17:35:35 +03:00

Merge pull request #34801 from poettering/async-sd-notify-close

pid1: close unexpected fds received via sd_notify() asyncronously
This commit is contained in:
Lennart Poettering 2024-10-17 14:43:19 +02:00 committed by GitHub
commit 49fd31df58
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 21 additions and 8 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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]);

View File

@ -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;
}

View File

@ -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);