]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
service: close fdstore asynchronously
authorLennart Poettering <lennart@poettering.net>
Tue, 4 Apr 2023 10:17:16 +0000 (12:17 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 13 Apr 2023 04:44:27 +0000 (06:44 +0200)
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.)

TODO
src/core/service.c

diff --git a/TODO b/TODO
index 29b1ac66011b1eeaac3b0a52bf8a52d2ef7e9d6e..19a2535e1bbd5c8130986db174df3ef4435ceda1 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1479,8 +1479,6 @@ Features:
 * maybe rework get_user_creds() to query the user database if $SHELL is used
   for root, but only then.
 
-* be stricter with fds we receive for the fdstore: close them asynchronously
-
 * calenderspec: add support for week numbers and day numbers within a
   year. This would allow us to define "bi-weekly" triggers safely.
 
index dcd62fabdcd8d3737ce73c4e5efc04236f39826c..c1669da3a2e5c1ff92bb26c28270b954ba396126 100644 (file)
@@ -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;