From ad922a36f5c5f92568055062b88d569928a27834 Mon Sep 17 00:00:00 2001 From: "/C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org" Date: Mon, 28 May 2007 12:46:38 +0000 Subject: Patches from Marius Tomaschewski : - Fixed sigterm_handler to close logfile and then call output_plugin->fini. The output_plugin->fini function may still use the logger (e.g. sqlite3 does), what causes a SEGV (really happens in case of sqlite3 db init error - as far as I remember) - Changed sighup_handler_print to not to call exit(2) on reopen failure, but try to reopen and fallback to continue using old descriptor on failure. - Fixed mac output in ulogd_BASE.c - Added explicit termination of the hostname buffer: "[...] if namelen is an insufficient length to hold the host name, then the returned name is truncated and it is unspecified whether the returned name is null-terminated. [...]" as SUSv2 specifies. - Added to print "\n" after ULOGD_RET_NONE type as well after an unspecified type. See example above at extensions/ulogd_BASE.c. - Fixed to set the '\0' at the end and not behind the buffer. --- ulogd/extensions/printpkt.c | 1 + ulogd/extensions/ulogd_BASE.c | 20 ++++++++++++++------ ulogd/extensions/ulogd_LOCAL.c | 1 + ulogd/extensions/ulogd_LOGEMU.c | 7 +++++-- ulogd/extensions/ulogd_OPRINT.c | 11 ++++++++--- ulogd/extensions/ulogd_PWSNIFF.c | 4 ++-- ulogd/ulogd.c | 5 +++-- 7 files changed, 34 insertions(+), 15 deletions(-) diff --git a/ulogd/extensions/printpkt.c b/ulogd/extensions/printpkt.c index 0b6d111..a9e78d7 100644 --- a/ulogd/extensions/printpkt.c +++ b/ulogd/extensions/printpkt.c @@ -267,6 +267,7 @@ int printpkt_init(void) strerror(errno)); exit(2); } + hostname[sizeof(hostname)-1] = '\0'; if (get_ids()) return 1; diff --git a/ulogd/extensions/ulogd_BASE.c b/ulogd/extensions/ulogd_BASE.c index f8abd70..0fd921c 100644 --- a/ulogd/extensions/ulogd_BASE.c +++ b/ulogd/extensions/ulogd_BASE.c @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -62,12 +63,14 @@ static ulog_iret_t *_interp_raw(ulog_interpreter_t *ip, ulog_packet_msg_t *pkt) { unsigned char *p; - int i; - char *buf, *oldbuf = NULL; + int i, tmp, len = 0; + char *buf, *ptr = NULL; ulog_iret_t *ret = ip->result; + size_t siz; if (pkt->mac_len) { - buf = (char *) malloc(3 * pkt->mac_len + 1); + siz = 3 * pkt->mac_len + 1; + buf = (char *) malloc(siz); if (!buf) { ulogd_log(ULOGD_ERROR, "OOM!!!\n"); return NULL; @@ -75,9 +78,14 @@ static ulog_iret_t *_interp_raw(ulog_interpreter_t *ip, *buf = '\0'; p = pkt->mac; - oldbuf = buf; - for (i = 0; i < pkt->mac_len; i++, p++) - sprintf(buf, "%s%02x%c", oldbuf, *p, i==pkt->mac_len-1 ? ' ':':'); + ptr = buf; + for (i = 0; i < pkt->mac_len; i++, p++) { + tmp = snprintf(ptr+len, siz-len, "%02x%s", + *p, i==pkt->mac_len-1 ? "":":"); + if (tmp == -1) + break; + len += tmp; + } ret[0].value.ptr = buf; ret[0].flags |= ULOGD_RETF_VALID; } diff --git a/ulogd/extensions/ulogd_LOCAL.c b/ulogd/extensions/ulogd_LOCAL.c index 1004586..6504ec6 100644 --- a/ulogd/extensions/ulogd_LOCAL.c +++ b/ulogd/extensions/ulogd_LOCAL.c @@ -93,6 +93,7 @@ void _init(void) strerror(errno)); exit(2); } + hostname[sizeof(hostname)-1] = '\0'; /* strip off everything after first '.' */ if ((tmp = strchr(hostname, '.'))) *tmp = '\0'; diff --git a/ulogd/extensions/ulogd_LOGEMU.c b/ulogd/extensions/ulogd_LOGEMU.c index 4b654c7..5473668 100644 --- a/ulogd/extensions/ulogd_LOGEMU.c +++ b/ulogd/extensions/ulogd_LOGEMU.c @@ -79,15 +79,18 @@ static int _output_logemu(ulog_iret_t *res) static void signal_handler_logemu(int signal) { + FILE *old=of; + switch (signal) { case SIGHUP: ulogd_log(ULOGD_NOTICE, "syslogemu: reopening logfile\n"); - fclose(of); of = fopen(syslogf_ce.u.string, "a"); if (!of) { ulogd_log(ULOGD_FATAL, "can't open syslogemu: %s\n", strerror(errno)); - exit(2); + of=old; + } else { + fclose(old); } break; default: diff --git a/ulogd/extensions/ulogd_OPRINT.c b/ulogd/extensions/ulogd_OPRINT.c index 701b645..ed34382 100644 --- a/ulogd/extensions/ulogd_OPRINT.c +++ b/ulogd/extensions/ulogd_OPRINT.c @@ -72,7 +72,10 @@ static int _output_print(ulog_iret_t *res) HIPQUAD(ret->value.ui32)); break; case ULOGD_RET_NONE: - fprintf(of, ""); + fprintf(of, "\n"); + break; + default: + fprintf(of, "\n"); break; } } @@ -88,16 +91,18 @@ static config_entry_t outf_ce = { static void sighup_handler_print(int signal) { + FILE *old=of; switch (signal) { case SIGHUP: ulogd_log(ULOGD_NOTICE, "PKTLOG: reopening logfile\n"); - fclose(of); of = fopen(outf_ce.u.string, "a"); if (!of) { ulogd_log(ULOGD_FATAL, "can't open PKTLOG: %s\n", strerror(errno)); - exit(2); + of=old; + } else { + fclose(old); } break; default: diff --git a/ulogd/extensions/ulogd_PWSNIFF.c b/ulogd/extensions/ulogd_PWSNIFF.c index 1f86bbe..d205cdd 100644 --- a/ulogd/extensions/ulogd_PWSNIFF.c +++ b/ulogd/extensions/ulogd_PWSNIFF.c @@ -116,7 +116,7 @@ static ulog_iret_t *_interp_pwsniff(ulog_interpreter_t *ip, ulog_packet_msg_t *p return NULL; } strncpy(ret[0].value.ptr, (char *)begp, len); - *((char *)ret[0].value.ptr + len + 1) = '\0'; + *((char *)ret[0].value.ptr + len) = '\0'; } if (pw_len) { ret[1].value.ptr = (char *) malloc(pw_len+1); @@ -126,7 +126,7 @@ static ulog_iret_t *_interp_pwsniff(ulog_interpreter_t *ip, ulog_packet_msg_t *p return NULL; } strncpy(ret[1].value.ptr, (char *)pw_begp, pw_len); - *((char *)ret[1].value.ptr + pw_len + 1) = '\0'; + *((char *)ret[1].value.ptr + pw_len) = '\0'; } return ret; diff --git a/ulogd/ulogd.c b/ulogd/ulogd.c index 9324a4f..5707ef8 100644 --- a/ulogd/ulogd.c +++ b/ulogd/ulogd.c @@ -595,14 +595,15 @@ static void sigterm_handler(int signal) ipulog_destroy_handle(libulog_h); free(libulog_buf); - if (logfile != stdout && logfile != &syslog_dummy) - fclose(logfile); for (p = ulogd_outputs; p; p = p->next) { if (p->fini) (*p->fini)(); } + if (logfile != stdout && logfile != &syslog_dummy) + fclose(logfile); + exit(0); } -- cgit v1.2.3