diff options
Diffstat (limited to 'src/exec.c')
-rw-r--r-- | src/exec.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -55,8 +55,12 @@ int log_exec(const char *dir, const char *prog, const char *arg) { return -1; } else if (pid == 0) { - dup2(p[1], 1); - dup2(p[1], 2); + + if (p[1] != 1) + dup2(p[1], 1); + + if (p[1] != 2) + dup2(p[1], 2); if (p[0] > 2) close(p[0]); @@ -65,16 +69,19 @@ int log_exec(const char *dir, const char *prog, const char *arg) { close(p[1]); close(0); - open("/dev/null", O_RDONLY); + if (open("/dev/null", O_RDONLY) != 0) { + daemon_log(LOG_ERR, "Unable to open /dev/null as STDIN"); + _exit(EXIT_FAILURE); + } - umask(0022); // Set up a sane umask + umask(0022); /* Set up a sane umask */ if (dir && chdir(dir) < 0) { daemon_log(LOG_WARNING, "Failed to change to directory '%s'", dir); chdir("/"); } - execl(prog, prog, arg, 0); + execl(prog, prog, arg, (char*) 0); daemon_log(LOG_ERR, "execl(%s) failed: %s\n", prog, strerror(errno)); @@ -134,8 +141,6 @@ int log_exec(const char *dir, const char *prog, const char *arg) { daemon_log(LOG_WARNING, "Killing child."); kill(pid, SIGTERM); } - - break; } } |