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:
commit
49fd31df58
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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]);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user