summaryrefslogtreecommitdiffstats
path: root/src/ulogd.c
diff options
context:
space:
mode:
authorHugo Mildenberger <Hugo.Mildenberger@t-online.de>2008-06-06 00:47:15 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2008-06-06 00:47:15 +0200
commit498711aaf9167061643feb802adb920f7ca3d0a2 (patch)
tree5d9b3b3fa1c7dae06fb916fba466c0c6fab8763a /src/ulogd.c
parent6396a180f3f15e7417a81b44c61184828268b341 (diff)
fix crash when SIGHUP is received.
crash due to ulogd_logfile set to a string allocated on stack by config_parse_file
Diffstat (limited to 'src/ulogd.c')
-rw-r--r--src/ulogd.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/ulogd.c b/src/ulogd.c
index 3a1e3d9..8c8dc14 100644
--- a/src/ulogd.c
+++ b/src/ulogd.c
@@ -75,8 +75,8 @@
/* global variables */
static FILE *logfile = NULL; /* logfile pointer */
-static char *ulogd_configfile = ULOGD_CONFIGFILE;
-static char *ulogd_logfile = ULOGD_LOGFILE_DEFAULT;
+static char *ulogd_logfile = NULL;
+static const char *ulogd_configfile = ULOGD_CONFIGFILE;
static FILE syslog_dummy;
static int info_mode = 0;
@@ -880,8 +880,10 @@ static void ulogd_main_loop(void)
/* open the logfile */
static int logfile_open(const char *name)
{
- if (name)
- ulogd_logfile = name;
+ if (name) {
+ free(ulogd_logfile);
+ ulogd_logfile = strdup(name);
+ }
if (!strcmp(name, "stdout")) {
logfile = stdout;
@@ -891,12 +893,12 @@ static int logfile_open(const char *name)
} else {
logfile = fopen(ulogd_logfile, "a");
if (!logfile) {
- fprintf(stderr, "ERROR: can't open logfile %s: %s\n",
+ fprintf(stderr, "ERROR: can't open logfile '%s': %s\n",
name, strerror(errno));
exit(2);
}
}
- ulogd_log(ULOGD_INFO, "ulogd Version %s starting\n", ULOGD_VERSION);
+ ulogd_log(ULOGD_INFO, "ulogd Version %s (re-)starting\n", ULOGD_VERSION);
return 0;
}
@@ -959,8 +961,10 @@ static void sigterm_handler(int signal)
deliver_signal_pluginstances(signal);
- if (logfile != stdout)
+ if (logfile != NULL && logfile != stdout) {
fclose(logfile);
+ logfile = NULL;
+ }
exit(0);
}
@@ -975,8 +979,13 @@ static void signal_handler(int signal)
if (logfile != stdout && logfile != &syslog_dummy) {
fclose(logfile);
logfile = fopen(ulogd_logfile, "a");
- if (!logfile)
+ if (!logfile) {
+ fprintf(stderr,
+ "ERROR: can't open logfile %s: %s\n",
+ ulogd_logfile, strerror(errno));
sigterm_handler(signal);
+ }
+
}
break;
default:
@@ -1021,6 +1030,7 @@ int main(int argc, char* argv[])
uid_t uid = 0;
gid_t gid = 0;
+ ulogd_logfile = strdup(ULOGD_LOGFILE_DEFAULT);
while ((argch = getopt_long(argc, argv, "c:dh::Vu:i:", opts, NULL)) != -1) {
switch (argch) {