mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-11 05:17:44 +03:00
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
|
||||
|
||||
* SIGALRM in systemctl
|
||||
|
||||
* 0595f9a1c182a84581749823ef47c5f292e545f9 is borked, freezes shutdown
|
||||
|
||||
Features:
|
||||
|
@ -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 (;;) {
|
||||
|
||||
|
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))
|
||||
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 (;;)
|
||||
|
Loading…
Reference in New Issue
Block a user