From 7f6d613516020bf390d8de25bbbb2551ea8dade0 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 9 Feb 2011 00:58:43 +0100 Subject: [PATCH 1/1] systemctl: make sure the tty agent does not retain a copy of stdio https://bugzilla.redhat.com/show_bug.cgi?id=674916 --- TODO | 14 ++++++++++++++ src/systemctl.c | 29 ++++++++++++++++++++++++++++- src/tty-ask-password-agent.c | 2 +- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index 2152f69d5..4e9d4e1be 100644 --- a/TODO +++ b/TODO @@ -14,6 +14,20 @@ Bugs: Features: +* make it possible to enable status msgs via RT sigs + +* udisks should not use udisks-part-id, instead use blkid. also not probe /dev/loopxxx + +* snd-seq muss weg + +* mount.tmpfs soll weg und grep weg + +* mdmon is irre + +* gnome-shell python script/glxinfo/is-accelerated wech + +* plymouth muss sauber exiten, wenn's schon läuft + * pull in by udev change event instead of only start event * PID heuristik bei Type=forking ausmachbar machen diff --git a/src/systemctl.c b/src/systemctl.c index 8cdc01aa4..66903aba2 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -151,13 +151,15 @@ static void spawn_ask_password_agent(void) { if (child == 0) { /* In the child */ - const char * const args[] = { SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH, "--watch", NULL }; + int fd; + + /* Make sure the agent goes away when the parent dies */ if (prctl(PR_SET_PDEATHSIG, SIGTERM) < 0) _exit(EXIT_FAILURE); @@ -166,6 +168,31 @@ static void spawn_ask_password_agent(void) { if (getppid() != parent) _exit(EXIT_SUCCESS); + /* Don't leak fds to the agent */ + close_all_fds(NULL, 0); + + /* Detach from stdin/stdout/stderr. and reopen + * /dev/tty for them. This is important to ensure that + * when systemctl is started via popen() or a similar + * call that expects to read EOF we actually do + * generate EOF and not delay this indefinitely by + * because we keep an unused copy of stdin around. */ + if ((fd = open("/dev/tty", O_RDWR|O_CLOEXEC|O_NONBLOCK)) < 0) { + log_error("Failed to open /dev/tty: %m"); + _exit(EXIT_FAILURE); + } + + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + + if (fd > 2) + close(fd); + execv(args[0], (char **) args); _exit(EXIT_FAILURE); } diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c index c3c5f7a8b..00496e711 100644 --- a/src/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent.c @@ -83,7 +83,7 @@ static int ask_password_plymouth(const char *message, usec_t until, const char * sa.sa.sa_family = AF_UNIX; strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1); if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) { - log_error("FIALED TO CONNECT: %m"); + log_error("FAILED TO CONNECT: %m"); r = -errno; goto finish; } -- 2.30.2