tree-wide: introduce new safe_fork() helper and port everything over
This adds a new safe_fork() wrapper around fork() and makes use of it everywhere. The new wrapper does a couple of things we previously did manually and separately in a safer, more correct and automatic way: 1. Optionally resets signal handlers/mask in the child 2. Sets a name on all processes we fork off right after forking off (and the patch assigns useful names for all processes we fork off now, following a systematic naming scheme: always enclosed in () – in order to indicate that these are not proper, exec()ed processes, but only forked off children, and if the process is long-running with only our own code, without execve()'ing something else, it gets am "sd-" prefix.) 3. Optionally closes all file descriptors in the child 4. Optionally sets a PR_SET_DEATHSIG to SIGTERM in the child, in a safe way so that the parent dying before this happens being handled safely. 5. Optionally reopens the logs 6. Optionally connects stdin/stdout/stderr to /dev/null 7. Debug logs about the forked off processes.
This commit is contained in:
+10
-19
@@ -1207,27 +1207,19 @@ static int setup_pam(
|
||||
|
||||
parent_pid = getpid_cached();
|
||||
|
||||
pam_pid = fork();
|
||||
if (pam_pid < 0) {
|
||||
r = -errno;
|
||||
r = safe_fork("(sd-pam)", 0, &pam_pid);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (pam_pid == 0) {
|
||||
if (r == 0) {
|
||||
int sig, ret = EXIT_PAM;
|
||||
|
||||
/* The child's job is to reset the PAM session on
|
||||
* termination */
|
||||
barrier_set_role(&barrier, BARRIER_CHILD);
|
||||
|
||||
/* This string must fit in 10 chars (i.e. the length
|
||||
* of "/sbin/init"), to look pretty in /bin/ps */
|
||||
rename_process("(sd-pam)");
|
||||
|
||||
/* Make sure we don't keep open the passed fds in this
|
||||
child. We assume that otherwise only those fds are
|
||||
open here that have been opened by PAM. */
|
||||
close_many(fds, n_fds);
|
||||
/* Make sure we don't keep open the passed fds in this child. We assume that otherwise only those fds
|
||||
* are open here that have been opened by PAM. */
|
||||
(void) close_many(fds, n_fds);
|
||||
|
||||
/* Drop privileges - we don't need any to pam_close_session
|
||||
* and this will make PR_SET_PDEATHSIG work in most cases.
|
||||
@@ -1879,11 +1871,10 @@ static int setup_private_users(uid_t uid, gid_t gid) {
|
||||
if (pipe2(errno_pipe, O_CLOEXEC) < 0)
|
||||
return -errno;
|
||||
|
||||
pid = fork();
|
||||
if (pid < 0)
|
||||
return -errno;
|
||||
|
||||
if (pid == 0) {
|
||||
r = safe_fork("(sd-userns)", FORK_RESET_SIGNALS|FORK_DEATHSIG, &pid);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0) {
|
||||
_cleanup_close_ int fd = -1;
|
||||
const char *a;
|
||||
pid_t ppid;
|
||||
|
||||
Reference in New Issue
Block a user