From 720ce21d444f6497299c4c99a76fda546b06716a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 11 Mar 2011 00:52:13 +0100 Subject: [PATCH] util: close all fds before freezing execution --- TODO | 2 -- src/dbus-common.c | 3 +++ src/util.c | 18 ++++++++++-------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/TODO b/TODO index f2e3be416..daa96773a 100644 --- a/TODO +++ b/TODO @@ -22,8 +22,6 @@ F15: * bind mounts are ignored -* SIGALRM in systemctl - * 0595f9a1c182a84581749823ef47c5f292e545f9 is borked, freezes shutdown Features: diff --git a/src/dbus-common.c b/src/dbus-common.c index 80b2115e1..809ea0f67 100644 --- a/src/dbus-common.c +++ b/src/dbus-common.c @@ -77,6 +77,9 @@ int bus_connect(DBusBusType t, DBusConnection **_bus, bool *private, DBusError * return -EACCES; } + /* This complexity should probably move into D-Bus itself: + * + * https://bugs.freedesktop.org/show_bug.cgi?id=35189 */ begin = tstamp = now(CLOCK_MONOTONIC); for (;;) { diff --git a/src/util.c b/src/util.c index c02b39e0a..c9366c4a3 100644 --- a/src/util.c +++ b/src/util.c @@ -1815,8 +1815,9 @@ int close_all_fds(const int except[], unsigned n_except) { if (ignore_file(de->d_name)) continue; - if ((r = safe_atoi(de->d_name, &fd)) < 0) - goto finish; + if (safe_atoi(de->d_name, &fd) < 0) + /* Let's better ignore this, just in case */ + continue; if (fd < 3) continue; @@ -1839,16 +1840,13 @@ int close_all_fds(const int except[], unsigned n_except) { continue; } - if ((r = close_nointr(fd)) < 0) { + if (close_nointr(fd) < 0) { /* Valgrind has its own FD and doesn't want to have it closed */ - if (errno != EBADF) - goto finish; + if (errno != EBADF && r == 0) + r = -errno; } } - r = 0; - -finish: closedir(d); return r; } @@ -3619,6 +3617,10 @@ int wait_for_terminate_and_warn(const char *name, pid_t pid) { } void freeze(void) { + + /* Make sure nobody waits for us on a socket anymore */ + close_all_fds(NULL, 0); + sync(); for (;;) -- 2.30.2