From 8e94f653489a0b3d549e61840a5cec711d466ab7 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 31 Oct 2009 02:43:47 +0100 Subject: daemon: make sure pa has its own session and process group, but is not its leader so that we cannot acquire a tty ever --- src/daemon/main.c | 40 ++++++++++++++++++++-------------------- src/pulsecore/core-util.c | 16 ++++++++++++++++ src/pulsecore/core-util.h | 2 ++ 3 files changed, 38 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/daemon/main.c b/src/daemon/main.c index c73e9afc..cc6f24bd 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -657,7 +657,7 @@ int main(int argc, char *argv[]) { #ifdef HAVE_FORK if (pipe(daemon_pipe) < 0) { - pa_log(_("pipe failed: %s"), pa_cstrerror(errno)); + pa_log(_("pipe() failed: %s"), pa_cstrerror(errno)); goto finish; } @@ -708,22 +708,27 @@ int main(int argc, char *argv[]) { pa_log_set_target(PA_LOG_SYSLOG); #ifdef HAVE_SETSID - setsid(); -#endif -#ifdef HAVE_SETPGID - setpgid(0,0); + if (setsid() < 0) { + pa_log(_("setsid() failed: %s"), pa_cstrerror(errno)); + goto finish; + } #endif -#ifndef OS_IS_WIN32 - pa_close(0); - pa_close(1); - pa_close(2); + /* We now are a session and process group leader. Let's fork + * again and let the father die, so that we'll become a + * process that can never acquire a TTY again, in a session and + * process group without leader */ - pa_assert_se(open("/dev/null", O_RDONLY) == 0); - pa_assert_se(open("/dev/null", O_WRONLY) == 1); - pa_assert_se(open("/dev/null", O_WRONLY) == 2); -#else - FreeConsole(); +#ifdef HAVE_FORK + if ((child = fork()) < 0) { + pa_log(_("fork() failed: %s"), pa_cstrerror(errno)); + goto finish; + } + + if (child != 0) { + retval = 0; + goto finish; + } #endif #ifdef SIGTTOU @@ -736,12 +741,7 @@ int main(int argc, char *argv[]) { signal(SIGTSTP, SIG_IGN); #endif -#ifdef TIOCNOTTY - if ((tty_fd = open("/dev/tty", O_RDWR)) >= 0) { - ioctl(tty_fd, TIOCNOTTY, (char*) 0); - pa_assert_se(pa_close(tty_fd) == 0); - } -#endif + pa_nullify_stdfds(); } pa_set_env_and_record("PULSE_INTERNAL", "1"); diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index 738bf065..2b0a60a8 100644 --- a/src/pulsecore/core-util.c +++ b/src/pulsecore/core-util.c @@ -2999,3 +2999,19 @@ finish: pa_make_fd_cloexec(fileno(f)); return f; } + +void pa_nullify_stdfds(void) { + +#ifndef OS_IS_WIN32 + pa_close(STDIN_FILENO); + pa_close(STDOUT_FILENO); + pa_close(STDERR_FILENO); + + pa_assert_se(open("/dev/null", O_RDONLY) == STDIN_FILENO); + pa_assert_se(open("/dev/null", O_WRONLY) == STDOUT_FILENO); + pa_assert_se(open("/dev/null", O_WRONLY) == STDERR_FILENO); +#else + FreeConsole(); +#endif + +} diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h index d50f79a2..9c9cf78a 100644 --- a/src/pulsecore/core-util.h +++ b/src/pulsecore/core-util.h @@ -265,4 +265,6 @@ int pa_pipe_cloexec(int pipefd[2]); int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen); FILE* pa_fopen_cloexec(const char *path, const char *mode); +void pa_nullify_stdfds(void); + #endif -- cgit