diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-07-23 11:34:00 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-07-23 11:39:45 +0200 |
commit | 45a68ed3073a006c44703acf2928be156805ef9f (patch) | |
tree | 47b390e17dab2415bf3525b71d1f5ab31bc37a07 /src/shared | |
parent | Move fork_agent() into shared/ (diff) | |
download | systemd-45a68ed3073a006c44703acf2928be156805ef9f.tar.xz systemd-45a68ed3073a006c44703acf2928be156805ef9f.zip |
Move freeze() into shared/
Library code should not call freeze(), this is something that should
only be done by "application code", so moving it into shared/ is appropriate.
The fallback to call _exit() is dropped: let's trust that the infinite loop
is infinite.
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/exec-util.c | 23 | ||||
-rw-r--r-- | src/shared/exec-util.h | 2 | ||||
-rw-r--r-- | src/shared/mount-util.c | 5 |
3 files changed, 27 insertions, 3 deletions
diff --git a/src/shared/exec-util.c b/src/shared/exec-util.c index 68e896a8fa..42f6c4d75a 100644 --- a/src/shared/exec-util.c +++ b/src/shared/exec-util.c @@ -448,6 +448,29 @@ ExecCommandFlags exec_command_flags_from_string(const char *s) { return 1 << idx; } +_noreturn_ void freeze(void) { + log_close(); + + /* Make sure nobody waits for us on a socket anymore */ + (void) close_all_fds(NULL, 0); + + sync(); + + /* Let's not freeze right away, but keep reaping zombies. */ + for (;;) { + int r; + siginfo_t si = {}; + + r = waitid(P_ALL, 0, &si, WEXITED); + if (r < 0 && errno != EINTR) + break; + } + + /* waitid() failed with an unexpected error, things are really borked. Freeze now! */ + for (;;) + pause(); +} + int fexecve_or_execve(int executable_fd, const char *executable, char *const argv[], char *const envp[]) { #if ENABLE_FEXECVE execveat(executable_fd, "", argv, envp, AT_EMPTY_PATH); diff --git a/src/shared/exec-util.h b/src/shared/exec-util.h index 21d28608f9..05f8e1af83 100644 --- a/src/shared/exec-util.h +++ b/src/shared/exec-util.h @@ -47,6 +47,8 @@ extern const gather_stdout_callback_t gather_environment[_STDOUT_CONSUME_MAX]; const char* exec_command_flags_to_string(ExecCommandFlags i); ExecCommandFlags exec_command_flags_from_string(const char *s); +_noreturn_ void freeze(void); + int fexecve_or_execve(int executable_fd, const char *executable, char *const argv[], char *const envp[]); int fork_agent(const char *name, int except[], size_t n_except, pid_t *ret_pid, const char *path, ...) _sentinel_; diff --git a/src/shared/mount-util.c b/src/shared/mount-util.c index 594efea989..cf8ca8d9d3 100644 --- a/src/shared/mount-util.c +++ b/src/shared/mount-util.c @@ -11,6 +11,7 @@ #include "alloc-util.h" #include "dissect-image.h" +#include "exec-util.h" #include "extract-word.h" #include "fd-util.h" #include "fileio.h" @@ -1010,11 +1011,9 @@ static int make_userns(uid_t uid_shift, uid_t uid_range) { r = safe_fork("(sd-mkuserns)", FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_NEW_USERNS, &pid); if (r < 0) return r; - if (r == 0) { + if (r == 0) /* Child. We do nothing here, just freeze until somebody kills us. */ freeze(); - _exit(EXIT_FAILURE); - } xsprintf(line, UID_FMT " " UID_FMT " " UID_FMT "\n", 0, uid_shift, uid_range); |