From 8ef7900438ed190301a2d9585ad81aac5987ee2a Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Tue, 6 May 2014 00:22:25 +0200 Subject: close files before running initrc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/mds-server.c | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) (limited to 'src/mds-server.c') diff --git a/src/mds-server.c b/src/mds-server.c index cb2bfc2..1349ee3 100644 --- a/src/mds-server.c +++ b/src/mds-server.c @@ -214,6 +214,25 @@ int main(int argc_, char** argv_) } if (pid == 0) /* Child process exec:s, the parent continues without waiting for it. */ { + /* Close all files except stdin, stdout and stderr. */ + DIR* dir = opendir(SELF_FD); + struct dirent* file; + + if (dir == NULL) + perror(*argv); /* Well, that is just unfortunate, but we cannot really do anything. */ + else + while ((file = readdir(dir)) != NULL) + if (strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) + { + int fd = atoi(file->d_name); + if (fd > 2) + close(fd); + } + + closedir(dir); + close(socket_fd); /* Perhaps it is stdin, stdout or stderr. */ + + /* Run initrc */ run_initrc(unparsed_args); return 1; } @@ -290,26 +309,21 @@ int main(int argc_, char** argv_) struct dirent* file; if (dir == NULL) - { - perror(*argv); /* Well, that is just unfortunate, but we cannot really do anything. */ - closedir(dir); - goto unmarshal_double_fail; - } - - while ((file = readdir(dir)) != NULL) - if (strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) - { - int fd = atoi(file->d_name); - if ((fd > 2) && (fd != socket_fd) && - (fd_table_contains_key(&client_map, fd) == 0)) - close(fd); - } + perror(*argv); /* Well, that is just unfortunate, but we cannot really do anything. */ + else + while ((file = readdir(dir)) != NULL) + if (strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) + { + int fd = atoi(file->d_name); + if ((fd > 2) && (fd != socket_fd) && + (fd_table_contains_key(&client_map, fd) == 0)) + close(fd); + } closedir(dir); } } - unmarshal_double_fail: /* Accepting incoming connections. */ while (running && (reexecing == 0)) { -- cgit v1.2.3-70-g09d2