umask(0);
- if (close(0) || close(1) || close(2)) {
- LOG_ERROR("Failed to close terminal FDs");
+ if (((devnull != STDIN_FILENO) && (dup2(devnull, STDIN_FILENO) == -1)) ||
+ ((devnull != STDOUT_FILENO) && (dup2(devnull, STDOUT_FILENO) == -1)) ||
+ ((devnull != STDERR_FILENO) && (dup2(devnull, STDERR_FILENO) == -1))) {
+ if (devnull > STDERR_FILENO)
+ (void) close(devnull);
+ /* coverity[leaked_handle] devnull is stdin/stdout/stderr */
exit(EXIT_FAILURE);
}
- if ((dup2(devnull, 0) < 0) || /* reopen stdin */
- (dup2(devnull, 1) < 0) || /* reopen stdout */
- (dup2(devnull, 2) < 0)) /* reopen stderr */
- exit(EXIT_FAILURE);
-
if ((devnull > STDERR_FILENO) && close(devnull)) {
LOG_ERROR("Failed to close descriptor %d: %s",
devnull, strerror(errno));
}
LOG_OPEN("cmirrord", LOG_PID, LOG_DAEMON);
- /* coverity[leaked_handle] devnull cannot leak here */
+ /* coverity[leaked_handle] devnull is stdin/stdout/stderr */
}
/*
if ((null_fd = open("/dev/null", O_RDWR)) < 0)
exit(EXIT_DESC_OPEN_FAILURE);
- if ((dup2(null_fd, STDIN_FILENO) == -1) ||
- (dup2(null_fd, STDOUT_FILENO) == -1) ||
- (dup2(null_fd, STDERR_FILENO) == -1))
+ if (((null_fd != STDIN_FILENO) && (dup2(null_fd, STDIN_FILENO) == -1)) ||
+ ((null_fd != STDOUT_FILENO) && (dup2(null_fd, STDOUT_FILENO) == -1)) ||
+ ((null_fd != STDERR_FILENO) && (dup2(null_fd, STDERR_FILENO) == -1))) {
+ if (null_fd > STDERR_FILENO)
+ (void) close(null_fd);
+ /* coverity[leaked_handle] null_fd is stdin/stdout/stderr */
exit(EXIT_DESC_OPEN_FAILURE);
+ }
if ((null_fd > STDERR_FILENO) && close(null_fd))
exit(EXIT_DESC_CLOSE_FAILURE);
setsid();
- /* coverity[leaked_handle] 'null_fd' handle is not leaking */
+ /* coverity[leaked_handle] 'null_fd' is stdin/stdout/stderr */
}
static int _reinstate_registrations(struct dm_event_fifos *fifos)
sigemptyset(&my_sigset);
if (sigprocmask(SIG_SETMASK, &my_sigset, NULL) < 0) {
fprintf(stderr, "Unable to restore signals.\n");
+ (void) close(fd);
exit(EXIT_FAILURE);
}
signal(SIGTERM, &_exit_handler);
switch (pid = fork()) {
case -1:
perror("fork failed:");
+ (void) close(fd);
exit(EXIT_FAILURE);
case 0: /* Child */
if (chdir("/")) {
perror("Cannot chdir to /");
+ (void) close(fd);
exit(1);
}
- if ((dup2(fd, STDIN_FILENO) == -1) ||
- (dup2(fd, STDOUT_FILENO) == -1) ||
- (dup2(fd, STDERR_FILENO) == -1)) {
+ if (((fd != STDIN_FILENO) && (dup2(fd, STDIN_FILENO) == -1)) ||
+ ((fd != STDOUT_FILENO) && (dup2(fd, STDOUT_FILENO) == -1)) ||
+ ((fd != STDERR_FILENO) && (dup2(fd, STDERR_FILENO) == -1))) {
perror("Error setting terminal FDs to /dev/null");
+ if (fd > STDERR_FILENO)
+ (void) close(fd);
+ /* coverity[leaked_handle] fd is stdin/stdout/stderr */
exit(2);
}
setsid();
- /* coverity[leaked_handle] 'fd' handle is not leaking */
+ /* coverity[leaked_handle] 'fd' is stdin/stdout/stderr */
}
response daemon_reply_simple(const char *id, ...)
return 0;
}
- if ((dup2(fd, STDIN_FILENO) == -1) ||
- (dup2(fd, STDOUT_FILENO) == -1) ||
- (dup2(fd, STDERR_FILENO) == -1)) {
+ if (((fd != STDIN_FILENO) && (dup2(fd, STDIN_FILENO) == -1)) ||
+ ((fd != STDOUT_FILENO) && (dup2(fd, STDOUT_FILENO) == -1)) ||
+ ((fd != STDERR_FILENO) && (dup2(fd, STDERR_FILENO) == -1))) {
if (fd > STDERR_FILENO)
(void) close(fd);
_early_log("Error redirecting stdin/out/err to null.");
- /* coverity[leaked_handle] no leak */
+ /* coverity[leaked_handle] fd is stdin/stdout/stderr */
return 0;
}
if (fd > STDERR_FILENO)
if (ffd != fm->fd)
(void) close(ffd);
- /* coverity[leaked_handle] no leak */
+ /* coverity[leaked_handle] fd is stdin/stdout/stderr */
return 1;
}