]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
global: use dev_null_fd instead of opening /dev/null
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 16 Nov 2016 09:37:34 +0000 (11:37 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 16 Nov 2016 10:24:47 +0000 (12:24 +0200)
src/lib-program-client/program-client-local.c
src/lib/module-dir.c
src/master/common.h
src/master/main.c
src/master/service-process.c

index d3533cc50d620d4250ed2027fd1fe7e4cc0149b0..bf605a75b8ba869b82241ba25468bfeb528919bd 100644 (file)
@@ -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 */
index 882b168924e4573d86695221d49ba0835e51b406..39ebbbd4910a4ca518c42990ac7897e53b15015b 100644 (file)
@@ -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
 }
index c17e36f8696032be0e92e66715e9d8b446fbb6f7..c1b7637d913d14b26ff7f1e80bbda79b3cc69c39 100644 (file)
@@ -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;
 
index 5cf1ac40817c8278d5473c242bf24a78142d18f0..2aa3a6ceadaa56ab9dcd73ec42857895b9ad2d1b 100644 (file)
@@ -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);
index 3e72c386cb8651ee61b15bb92851c4b73a51efd8..19eba6571d8bc8d9a8bca5af014900fd922eb750 100644 (file)
@@ -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: