From: Lennart Poettering Date: Thu, 10 Mar 2011 23:52:13 +0000 (+0100) Subject: util: close all fds before freezing execution X-Git-Tag: v21~119 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=720ce21d444f6497299c4c99a76fda546b06716a;p=systemd util: close all fds before freezing execution --- diff --git a/TODO b/TODO index f2e3be41..daa96773 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 80b2115e..809ea0f6 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 c02b39e0..c9366c4a 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 (;;)