From: Timo Sirainen Date: Wed, 16 Nov 2016 09:37:34 +0000 (+0200) Subject: global: use dev_null_fd instead of opening /dev/null X-Git-Tag: 2.3.0.rc1~2621 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=41ee23907b084da5baed459e35bccd5a33430419;p=thirdparty%2Fdovecot%2Fcore.git global: use dev_null_fd instead of opening /dev/null --- diff --git a/src/lib-program-client/program-client-local.c b/src/lib-program-client/program-client-local.c index 735b91445f..95acc0efba 100644 --- a/src/lib-program-client/program-client-local.c +++ b/src/lib-program-client/program-client-local.c @@ -54,40 +54,26 @@ void exec_child(const char *bin_path, const char *const *args, /* 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 45f7ec5f5b..f5fc4ac58a 100644 --- a/src/lib/module-dir.c +++ b/src/lib/module-dir.c @@ -150,25 +150,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 4a5c6548d7..c2aaf4c2fb 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; @@ -824,12 +824,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); @@ -841,10 +835,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 cd5b613ffb..c70d9c10ef 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: