util: close all fds before freezing execution

This commit is contained in:
Lennart Poettering 2011-03-11 00:52:13 +01:00
parent b997812119
commit 720ce21d44
3 changed files with 13 additions and 10 deletions

2
TODO
View File

@ -22,8 +22,6 @@ F15:
* bind mounts are ignored * bind mounts are ignored
* SIGALRM in systemctl
* 0595f9a1c182a84581749823ef47c5f292e545f9 is borked, freezes shutdown * 0595f9a1c182a84581749823ef47c5f292e545f9 is borked, freezes shutdown
Features: Features:

View File

@ -77,6 +77,9 @@ int bus_connect(DBusBusType t, DBusConnection **_bus, bool *private, DBusError *
return -EACCES; 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); begin = tstamp = now(CLOCK_MONOTONIC);
for (;;) { for (;;) {

View File

@ -1815,8 +1815,9 @@ int close_all_fds(const int except[], unsigned n_except) {
if (ignore_file(de->d_name)) if (ignore_file(de->d_name))
continue; continue;
if ((r = safe_atoi(de->d_name, &fd)) < 0) if (safe_atoi(de->d_name, &fd) < 0)
goto finish; /* Let's better ignore this, just in case */
continue;
if (fd < 3) if (fd < 3)
continue; continue;
@ -1839,16 +1840,13 @@ int close_all_fds(const int except[], unsigned n_except) {
continue; 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 */ /* Valgrind has its own FD and doesn't want to have it closed */
if (errno != EBADF) if (errno != EBADF && r == 0)
goto finish; r = -errno;
} }
} }
r = 0;
finish:
closedir(d); closedir(d);
return r; return r;
} }
@ -3619,6 +3617,10 @@ int wait_for_terminate_and_warn(const char *name, pid_t pid) {
} }
void freeze(void) { void freeze(void) {
/* Make sure nobody waits for us on a socket anymore */
close_all_fds(NULL, 0);
sync(); sync();
for (;;) for (;;)