util: close all fds before freezing execution
This commit is contained in:
parent
b997812119
commit
720ce21d44
2
TODO
2
TODO
|
@ -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:
|
||||||
|
|
|
@ -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 (;;) {
|
||||||
|
|
||||||
|
|
18
src/util.c
18
src/util.c
|
@ -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 (;;)
|
||||||
|
|
Loading…
Reference in New Issue