summaryrefslogtreecommitdiff
path: root/src/core/service.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-04-04 12:17:16 +0200
committerLennart Poettering <lennart@poettering.net>2023-04-13 06:44:27 +0200
commit99620f457ed0886852ba18c9093b59767299121c (patch)
treecad22f11cb1f4a71cc7101a6547992d65e0d486d /src/core/service.c
parent4fb8f1e88322b94b0fa051d3c6fd19cac0227aaa (diff)
downloadsystemd-99620f457ed0886852ba18c9093b59767299121c.tar.gz
service: close fdstore asynchronously
The file descriptors we keep in the fdstore might be basically anything, let's clean it up with our asynchronous closing feature, to not deadlock on close(). (Let's also do the same for stdin/stdout/stderr fds, since they might point to network services these days.)
Diffstat (limited to 'src/core/service.c')
-rw-r--r--src/core/service.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/core/service.c b/src/core/service.c
index dcd62fabdc..c1669da3a2 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -389,7 +389,7 @@ static void service_fd_store_unlink(ServiceFDStore *fs) {
sd_event_source_disable_unref(fs->event_source);
free(fs->fdname);
- safe_close(fs->fd);
+ asynchronous_close(fs->fd);
free(fs);
}
@@ -415,9 +415,9 @@ static void service_release_stdio_fd(Service *s) {
log_unit_debug(UNIT(s), "Releasing stdin/stdout/stderr file descriptors.");
- s->stdin_fd = safe_close(s->stdin_fd);
- s->stdout_fd = safe_close(s->stdout_fd);
- s->stderr_fd = safe_close(s->stderr_fd);
+ s->stdin_fd = asynchronous_close(s->stdin_fd);
+ s->stdout_fd = asynchronous_close(s->stdout_fd);
+ s->stderr_fd = asynchronous_close(s->stderr_fd);
}
static void service_done(Unit *u) {
Service *s = SERVICE(u);
@@ -500,7 +500,7 @@ static int service_add_fd_store(Service *s, int fd, const char *name, bool do_po
if (r < 0)
return r;
if (r > 0) {
- safe_close(fd);
+ asynchronous_close(fd);
return 0; /* fd already included */
}
}
@@ -543,7 +543,7 @@ static int service_add_fd_store_set(Service *s, FDSet *fds, const char *name, bo
assert(s);
while (fdset_size(fds) > 0) {
- _cleanup_close_ int fd = -EBADF;
+ _cleanup_(asynchronous_closep) int fd = -EBADF;
fd = fdset_steal_first(fds);
if (fd < 0)
@@ -558,7 +558,8 @@ static int service_add_fd_store_set(Service *s, FDSet *fds, const char *name, bo
return log_unit_error_errno(UNIT(s), r, "Failed to add fd to store: %m");
if (r > 0)
log_unit_debug(UNIT(s), "Added fd %i (%s) to fd store.", fd, strna(name));
- fd = -EBADF;
+
+ TAKE_FD(fd);
}
return 0;