tgtd was deamonized and forked the logger daemon quite late during startup, leading to the logger getting ahold of resources (IPC fd) it should not have. This also fixes the working dir and closes the std{in,out,err} file descriptors of the logger daemon. Signed-off-by: Arne Redlich <arne.redlich@xxxxxxxxxxxxxx> --- usr/log.c | 20 ++++++++++++++++++++ usr/tgtd.c | 28 ++++++++++++++-------------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/usr/log.c b/usr/log.c index 056314a..cf7e905 100644 --- a/usr/log.c +++ b/usr/log.c @@ -17,6 +17,7 @@ * 02110-1301 USA */ #include <ctype.h> +#include <fcntl.h> #include <string.h> #include <stdarg.h> #include <stdio.h> @@ -27,6 +28,7 @@ #include <errno.h> #include <sys/shm.h> #include <sys/ipc.h> +#include <sys/stat.h> #include <sys/types.h> #include <sys/wait.h> @@ -340,6 +342,7 @@ int log_init(char *program_name, int size, int daemon, int debug) if (daemon) { struct sigaction sa_old; struct sigaction sa_new; + int fd; openlog(log_name, 0, LOG_DAEMON); setlogmask (LOG_UPTO (LOG_DEBUG)); @@ -360,6 +363,23 @@ int log_init(char *program_name, int size, int daemon, int debug) return 0; } + fd = open("/dev/null", O_RDWR); + if (fd < 0) { + syslog(LOG_ERR, "failed to open /dev/null: %s\n", + strerror(errno)); + exit(1); + } + + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + setsid(); + if (chdir("/") < 0) { + syslog(LOG_ERR, "failed to chdir to '/': %s\n", + strerror(errno)); + exit(1); + } + /* flush on daemon's crash */ sa_new.sa_handler = (void*)log_flush; sigemptyset(&sa_new.sa_mask); diff --git a/usr/tgtd.c b/usr/tgtd.c index 945be31..3e0d400 100644 --- a/usr/tgtd.c +++ b/usr/tgtd.c @@ -348,19 +348,7 @@ int main(int argc, char **argv) } } - ep_fd = epoll_create(4096); - if (ep_fd < 0) { - fprintf(stderr, "can't create epoll fd, %m\n"); - exit(1); - } - - nr_lld = lld_init(&use_kernel, argv[optind]); - if (!nr_lld) { - fprintf(stderr, "No available low level driver!\n"); - exit(1); - } - - err = ipc_init(); + err = log_init(program_name, LOG_SPACE_SIZE, is_daemon, is_debug); if (err) exit(1); @@ -375,7 +363,19 @@ int main(int argc, char **argv) if (err) exit(1); - err = log_init(program_name, LOG_SPACE_SIZE, is_daemon, is_debug); + ep_fd = epoll_create(4096); + if (ep_fd < 0) { + fprintf(stderr, "can't create epoll fd, %m\n"); + exit(1); + } + + nr_lld = lld_init(&use_kernel, argv[optind]); + if (!nr_lld) { + fprintf(stderr, "No available low level driver!\n"); + exit(1); + } + + err = ipc_init(); if (err) exit(1); -- 1.6.0.4 -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html