From 0975ed0fb7773881d8f2ffccf3de33f433273b24 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Mon, 6 Apr 2020 15:55:47 +0200 Subject: [PATCH] runsvc: make sure we close all fds before running a service Just in case initd leaks anything. Also, the service has no buisness writing all over /dev/console. It's a system service, it better use syslog or its own internal logging service. Signed-off-by: David Oberhollenzer --- cmd/runsvc.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/cmd/runsvc.c b/cmd/runsvc.c index db2de5b..ab07b4a 100644 --- a/cmd/runsvc.c +++ b/cmd/runsvc.c @@ -6,15 +6,18 @@ #include #include #include +#include #include #include #include +#include #include "service.h" #include "libcfg.h" #include "config.h" #define ENVFILE ETCPATH "/initd.env" +#define PROCFDDIR "/proc/self/fd" static int setup_env(void) { @@ -55,6 +58,30 @@ static int setup_env(void) return status; } +static int close_all_files(void) +{ + struct dirent *ent; + DIR *dir; + int fd; + + dir = opendir(PROCFDDIR); + if (dir == NULL) { + perror(PROCFDDIR); + return -1; + } + + while ((ent = readdir(dir)) != NULL) { + if (!isdigit(ent->d_name[0])) + continue; + + fd = atoi(ent->d_name); + close(fd); + } + + closedir(dir); + return 0; +} + static int setup_tty(const char *tty, bool truncate) { int fd; @@ -71,10 +98,6 @@ static int setup_tty(const char *tty, bool truncate) if (truncate) ftruncate(fd, 0); - close(STDIN_FILENO); - close(STDOUT_FILENO); - close(STDERR_FILENO); - setsid(); dup2(fd, STDIN_FILENO); @@ -162,6 +185,9 @@ int main(int argc, char **argv) if (setup_env()) return EXIT_FAILURE; + if (close_all_files()) + return EXIT_FAILURE; + if (setup_tty(svc->ctty, (svc->flags & SVC_FLAG_TRUNCATE_OUT) != 0)) return EXIT_FAILURE;