From 2bd7df00a26bb0cb26283f56eef18659aaa65730 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 17 Feb 2008 21:53:21 +0100 Subject: [PATCH 1/1] Be more careful in daemon_init(). setsid(), chdir() and dup2() all may fail. So check the return value. --- daemon.c | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/daemon.c b/daemon.c index a2fa1caa..c790c17b 100644 --- a/daemon.c +++ b/daemon.c @@ -27,28 +27,36 @@ void daemon_init(void) pid_t pid; int null; - PARA_INFO_LOG("%s", "daemonizing\n"); - if ((pid = fork()) < 0) { - PARA_EMERG_LOG("%s", "failed to init daemon\n"); - exit(EXIT_FAILURE); - } else if (pid) + PARA_INFO_LOG("daemonizing\n"); + pid = fork(); + if (pid < 0) + goto err; + if (pid) exit(EXIT_SUCCESS); /* parent exits */ - /* child */ - setsid(); /* become session leader */ - chdir("/"); + /* become session leader */ + if (setsid() < 0) + goto err; + if (chdir("/") < 0) + goto err; umask(0); - null = open("/dev/null", O_RDONLY); if (null < 0) - exit(EXIT_FAILURE); - dup2(null, STDIN_FILENO); - dup2(null, STDOUT_FILENO); - dup2(null, STDERR_FILENO); + goto err; + if (dup2(null, STDIN_FILENO) < 0) + goto err; + if (dup2(null, STDOUT_FILENO) < 0) + goto err; + if (dup2(null, STDERR_FILENO) < 0) + goto err; close(null); + return; +err: + PARA_EMERG_LOG("fatal: %s\n", strerror(errno)); + exit(EXIT_FAILURE); } /** - * fopen() a file in append mode. + * fopen() the given file in append mode. * * \param logfile_name The name of the file to open. * @@ -58,11 +66,11 @@ FILE *open_log(const char *logfile_name) { FILE *logfile; - if (!logfile_name) - return NULL; - if (!(logfile = fopen(logfile_name, "a"))) { - PARA_EMERG_LOG("can not open %s, uid: %d\n", logfile_name, - (int)getuid()); + assert(logfile_name); + logfile = fopen(logfile_name, "a"); + if (!logfile) { + PARA_EMERG_LOG("can not open %s: %s\n", logfile_name, + strerror(errno)); exit(EXIT_FAILURE); } setlinebuf(logfile); -- 2.30.2