From e16516fefca6ba22bf4d848b4207b4d5b8d1eef9 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Tue, 6 May 2014 00:15:02 +0200 Subject: close untracked files if unmarshal from re-exec fails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/config.h | 8 ++++++++ src/mds-server.c | 26 ++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/config.h b/src/config.h index 09c3210..174fe30 100644 --- a/src/config.h +++ b/src/config.h @@ -125,6 +125,14 @@ #endif +/** + * The path to the directory with symlinks to each file that is open + */ +#ifndef SELF_FD +#define SELF_FD "/proc/self/fd" +#endif + + /** * Pattern for the names of shared object to which states are marshalled */ diff --git a/src/mds-server.c b/src/mds-server.c index 826e0d2..cb2bfc2 100644 --- a/src/mds-server.c +++ b/src/mds-server.c @@ -39,6 +39,8 @@ #include #include #include +#include +#include @@ -283,11 +285,31 @@ int main(int argc_, char** argv_) } if (r < 0) { - /* TODO: close all sockets we do not know what they are. */ + /* Close all files (hopefully sockets) we do not know what they are. */ + DIR* dir = opendir(SELF_FD); + 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); + } + + closedir(dir); } } - + unmarshal_double_fail: /* Accepting incoming connections. */ while (running && (reexecing == 0)) { -- cgit v1.2.3-70-g09d2