From 2481c3013d13608e8ec9cd2d3914a0a61437d2ca Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 16 Nov 2016 11:37:34 +0200 Subject: [PATCH] global: use dev_null_fd instead of opening /dev/null --- src/lib-program-client/program-client-local.c | 32 ++++++------------- src/lib/module-dir.c | 9 ++---- src/master/common.h | 2 +- src/master/main.c | 16 +++------- src/master/service-process.c | 2 +- 5 files changed, 18 insertions(+), 43 deletions(-) diff --git a/src/lib-program-client/program-client-local.c b/src/lib-program-client/program-client-local.c index d3533cc50d..bf605a75b8 100644 --- a/src/lib-program-client/program-client-local.c +++ b/src/lib-program-client/program-client-local.c @@ -52,40 +52,26 @@ void exec_child(const char *bin_path, const char *const *args, const char *const /* Setup stdin/stdout */ - if (in_fd < 0) { - in_fd = open("/dev/null", O_RDONLY); - - if (in_fd == -1) - i_fatal("open(/dev/null) failed: %m"); - } - if (out_fd < 0) { - out_fd = open("/dev/null", O_WRONLY); - - if (out_fd == -1) - i_fatal("open(/dev/null) failed: %m"); - } + if (in_fd < 0) + in_fd = dev_null_fd; + if (out_fd < 0) + out_fd = dev_null_fd; if (in_fd != STDIN_FILENO && dup2(in_fd, STDIN_FILENO) < 0) i_fatal("dup2(stdin) failed: %m"); if (out_fd != STDOUT_FILENO && dup2(out_fd, STDOUT_FILENO) < 0) i_fatal("dup2(stdout) failed: %m"); - if (in_fd != STDIN_FILENO && close(in_fd) < 0) + if (in_fd != STDIN_FILENO && in_fd != dev_null_fd && close(in_fd) < 0) i_error("close(in_fd) failed: %m"); - if (out_fd != STDOUT_FILENO && (out_fd != in_fd) && close(out_fd) < 0) + if (out_fd != STDOUT_FILENO && out_fd != dev_null_fd && + (out_fd != in_fd) && close(out_fd) < 0) i_error("close(out_fd) failed: %m"); /* Drop stderr if requested */ if (drop_stderr) { - int err_fd = open("/dev/null", O_WRONLY); - if (err_fd == -1) - i_fatal("open(/dev/null) failed: %m"); - if (err_fd != STDERR_FILENO) { - if (dup2(err_fd, STDERR_FILENO) < 0) - i_fatal("dup2(stderr) failed: %m"); - if (close(err_fd) < 0) - i_error("close(err_fd) failed: %m"); - } + if (dup2(dev_null_fd, STDERR_FILENO) < 0) + i_fatal("dup2(stderr) failed: %m"); } /* Setup extra fds */ diff --git a/src/lib/module-dir.c b/src/lib/module-dir.c index 882b168924..39ebbbd491 100644 --- a/src/lib/module-dir.c +++ b/src/lib/module-dir.c @@ -149,25 +149,20 @@ static void *quiet_dlopen(const char *path, int flags) return dlopen(path, flags); #else void *handle; - int fd, fd_null; + int fd; /* OpenBSD likes to print all "undefined symbol" errors to stderr. Hide them by sending them to /dev/null. */ - fd_null = open("/dev/null", O_WRONLY); - if (fd_null == -1) - i_fatal("open(/dev/null) failed: %m"); fd = dup(STDERR_FILENO); if (fd == -1) i_fatal("dup() failed: %m"); - if (dup2(fd_null, STDERR_FILENO) < 0) + if (dup2(dev_null_fd, STDERR_FILENO) < 0) i_fatal("dup2() failed: %m"); handle = dlopen(path, flags); if (dup2(fd, STDERR_FILENO) < 0) i_fatal("dup2() failed: %m"); if (close(fd) < 0) i_error("close() failed: %m"); - if (close(fd_null) < 0) - i_error("close() failed: %m"); return handle; #endif } diff --git a/src/master/common.h b/src/master/common.h index c17e36f869..c1b7637d91 100644 --- a/src/master/common.h +++ b/src/master/common.h @@ -9,7 +9,7 @@ extern uid_t master_uid; extern gid_t master_gid; extern bool core_dumps_disabled; extern const char *ssl_manual_key_password; -extern int null_fd, global_master_dead_pipe_fd[2]; +extern int global_master_dead_pipe_fd[2]; extern struct service_list *services; extern bool startup_finished; diff --git a/src/master/main.c b/src/master/main.c index 5cf1ac4081..2aa3a6cead 100644 --- a/src/master/main.c +++ b/src/master/main.c @@ -43,7 +43,7 @@ uid_t master_uid; gid_t master_gid; bool core_dumps_disabled; const char *ssl_manual_key_password; -int null_fd, global_master_dead_pipe_fd[2]; +int global_master_dead_pipe_fd[2]; struct service_list *services; bool startup_finished = FALSE; @@ -826,12 +826,6 @@ int main(int argc, char *argv[]) i_fatal("Unknown argument: --%s", argv[optind]); } - null_fd = open("/dev/null", O_WRONLY); - if (null_fd == -1) - i_fatal("Can't open /dev/null: %m"); - fd_close_on_exec(null_fd, TRUE); - i_assert(null_fd > STDERR_FILENO); - if (pipe(global_master_dead_pipe_fd) < 0) i_fatal("pipe() failed: %m"); fd_close_on_exec(global_master_dead_pipe_fd[0], TRUE); @@ -843,10 +837,10 @@ int main(int argc, char *argv[]) t_askpass("Give the password for SSL keys: "); } - if (dup2(null_fd, STDIN_FILENO) < 0) - i_fatal("dup2(null_fd) failed: %m"); - if (!foreground && dup2(null_fd, STDOUT_FILENO) < 0) - i_fatal("dup2(null_fd) failed: %m"); + if (dup2(dev_null_fd, STDIN_FILENO) < 0) + i_fatal("dup2(dev_null_fd) failed: %m"); + if (!foreground && dup2(dev_null_fd, STDOUT_FILENO) < 0) + i_fatal("dup2(dev_null_fd) failed: %m"); pidfile_path = i_strconcat(set->base_dir, "/"MASTER_PID_FILE_NAME, NULL); diff --git a/src/master/service-process.c b/src/master/service-process.c index 3e72c386cb..19eba6571d 100644 --- a/src/master/service-process.c +++ b/src/master/service-process.c @@ -122,7 +122,7 @@ service_dup_fds(struct service *service) case SERVICE_TYPE_LOG: case SERVICE_TYPE_ANVIL: case SERVICE_TYPE_CONFIG: - dup2_append(&dups, null_fd, MASTER_ANVIL_FD); + dup2_append(&dups, dev_null_fd, MASTER_ANVIL_FD); break; case SERVICE_TYPE_UNKNOWN: case SERVICE_TYPE_LOGIN: