diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2021-03-20 16:12:14 +0100 |
---|---|---|
committer | Sergey Bugaev <bugaevc@gmail.com> | 2021-03-22 17:34:07 +0100 |
commit | 7e0ed2e9a2fea20b21d17b374fdb709589e02008 (patch) | |
tree | 08c437dd23d819e6c3c290a987df3b93ebc344d9 | |
parent | log: protect errno in log_open() (diff) | |
download | systemd-7e0ed2e9a2fea20b21d17b374fdb709589e02008.tar.xz systemd-7e0ed2e9a2fea20b21d17b374fdb709589e02008.zip |
tree-wide: reopen log after fork when needed
This follows up on 0b1f3c768ce1bd1490a5e53f539976dcef8ca765, adding more places
where we should reopen the log after forking with FORK_CLOSE_ALL_FDS.
When immediately calling exec in the child, prefer to explicitly reopen the log
after exec fails. In other cases, just use FORK_REOPEN_LOG.
-rw-r--r-- | src/basic/process-util.c | 6 | ||||
-rw-r--r-- | src/home/homed-home.c | 6 | ||||
-rw-r--r-- | src/home/homework-fscrypt.c | 4 | ||||
-rw-r--r-- | src/login/logind-brightness.c | 2 | ||||
-rw-r--r-- | src/shared/dissect-image.c | 1 |
5 files changed, 14 insertions, 5 deletions
diff --git a/src/basic/process-util.c b/src/basic/process-util.c index eb257144f0..264ecc276b 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -1467,7 +1467,11 @@ int fork_agent(const char *name, const int except[], size_t n_except, pid_t *ret /* Spawns a temporary TTY agent, making sure it goes away when we go away */ - r = safe_fork_full(name, except, n_except, FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS, ret_pid); + r = safe_fork_full(name, + except, + n_except, + FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_REOPEN_LOG, + ret_pid); if (r < 0) return r; if (r > 0) diff --git a/src/home/homed-home.c b/src/home/homed-home.c index 5a777e88ef..b0c5ce4232 100644 --- a/src/home/homed-home.c +++ b/src/home/homed-home.c @@ -1007,7 +1007,7 @@ static int home_start_work(Home *h, const char *verb, UserRecord *hr, UserRecord r = safe_fork_full("(sd-homework)", (int[]) { stdin_fd, stdout_fd }, 2, - FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG, &pid); + FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG|FORK_REOPEN_LOG, &pid); if (r < 0) return r; if (r == 0) { @@ -1838,7 +1838,9 @@ int home_killall(Home *h) { assert(h->uid > 0); /* We never should be UID 0 */ /* Let's kill everything matching the specified UID */ - r = safe_fork("(sd-killer)", FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_WAIT|FORK_LOG, NULL); + r = safe_fork("(sd-killer)", + FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_WAIT|FORK_LOG|FORK_REOPEN_LOG, + NULL); if (r < 0) return r; if (r == 0) { diff --git a/src/home/homework-fscrypt.c b/src/home/homework-fscrypt.c index d0676f8ae6..037e4853fd 100644 --- a/src/home/homework-fscrypt.c +++ b/src/home/homework-fscrypt.c @@ -324,7 +324,9 @@ int home_prepare_fscrypt( /* Also install the access key in the user's own keyring */ if (uid_is_valid(h->uid)) { - r = safe_fork("(sd-addkey)", FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG|FORK_WAIT, NULL); + r = safe_fork("(sd-addkey)", + FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG|FORK_WAIT|FORK_REOPEN_LOG, + NULL); if (r < 0) return log_error_errno(r, "Failed install encryption key in user's keyring: %m"); if (r == 0) { diff --git a/src/login/logind-brightness.c b/src/login/logind-brightness.c index 5eb3534f53..d6b9289ea6 100644 --- a/src/login/logind-brightness.c +++ b/src/login/logind-brightness.c @@ -137,7 +137,7 @@ static int brightness_writer_fork(BrightnessWriter *w) { assert(w->child == 0); assert(!w->child_event_source); - r = safe_fork("(sd-bright)", FORK_DEATHSIG|FORK_NULL_STDIO|FORK_CLOSE_ALL_FDS|FORK_LOG, &w->child); + r = safe_fork("(sd-bright)", FORK_DEATHSIG|FORK_NULL_STDIO|FORK_CLOSE_ALL_FDS|FORK_LOG|FORK_REOPEN_LOG, &w->child); if (r < 0) return r; if (r == 0) { diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 6f9a457614..cca92e7fb4 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -1287,6 +1287,7 @@ static int run_fsck(const char *node, const char *fstype) { if (r == 0) { /* Child */ execl("/sbin/fsck", "/sbin/fsck", "-aT", node, NULL); + log_open(); log_debug_errno(errno, "Failed to execl() fsck: %m"); _exit(FSCK_OPERATIONAL_ERROR); } |