aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorDavid Oberhollenzer <goliath@infraroot.at>2020-04-06 15:55:47 +0200
committerDavid Oberhollenzer <goliath@infraroot.at>2020-04-06 15:55:47 +0200
commit0975ed0fb7773881d8f2ffccf3de33f433273b24 (patch)
tree98f5d1d4ccdf403e6638c5dd741cb8c6c063dbf8 /cmd
parent9b43890591da92497a104490efd4e63157cb7c53 (diff)
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 <goliath@infraroot.at>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/runsvc.c34
1 files 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 <unistd.h>
#include <stdlib.h>
#include <string.h>
+#include <dirent.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
+#include <ctype.h>
#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;