[syslog-ng] Segfault under RHEL4U2
Balazs Scheidler
bazsi at balabit.hu
Tue Feb 28 19:49:24 CET 2006
On Mon, 2006-02-27 at 17:33 -0600, Paul Krizak wrote:
> I just downloaded 1.9.9 and I'm getting a segfault for the following
> syslog-ng.conf:
>
> source s_external_syslog {
> udp(port(514));
> };
>
> destination d_re_mce_aggregator {
> program(
> "/bin/true"
> );
> };
>
> log {
> source(s_external_syslog);
> destination(d_re_mce_aggregator);
> };
>
The patch below should fix this (available in tomorrow's snapshot as
well). It actually fixes another bug that prevents syslog-ng noticing
exited programs (in order to restart them), but please notice that the
configuration above will generate a lot of program executions
as /bin/true will immediately exit without processing messages at all.
--- orig/ChangeLog
+++ mod/ChangeLog
@@ -2,6 +2,25 @@
# arch-tag: automatic-ChangeLog--devel at balabit.hu--other-1/syslog-ng--mainline--2.0
#
+2006-02-28 18:47:01 GMT Balazs Scheidler <bazsi at balabit.hu> patch-20
+
+ Summary:
+ fixed possible abort in program destination
+ Revision:
+ syslog-ng--mainline--2.0--patch-20
+
+ * src/afprog.c (afprogram_dd_deinit): don't drop the reference to
+ self->writer, only deinit it,
+ (afprogram_dd_free): drop the reference to self->writer,
+
+ * src/main.c (main_loop_run): change the loop so that it actually
+ processes exited children
+
+
+ modified files:
+ ChangeLog src/afprog.c src/main.c
+
+
2006-02-26 09:39:39 GMT Balazs Scheidler <bazsi at balabit.hu> patch-19
Summary:
--- orig/src/afprog.c
+++ mod/src/afprog.c
@@ -141,10 +141,7 @@ afprogram_dd_deinit(LogPipe *s, GlobalCo
self->pid = -1;
}
if (self->writer)
- {
- log_pipe_deinit(self->writer, NULL, NULL);
- log_pipe_unref(self->writer);
- }
+ log_pipe_deinit(self->writer, NULL, NULL);
return TRUE;
}
@@ -153,7 +150,7 @@ afprogram_dd_free(LogPipe *s)
{
AFProgramDestDriver *self = (AFProgramDestDriver *) s;
- g_assert(!self->writer);
+ log_pipe_unref(self->writer);
g_string_free(self->cmdline, TRUE);
log_drv_free_instance(&self->super);
g_free(self);
--- orig/src/main.c
+++ mod/src/main.c
@@ -172,14 +172,15 @@ main_loop_run(GlobalConfig *cfg)
}
if (sig_child_received)
{
- pid_t pid = 0;
+ pid_t pid;
int status;
- while (pid > 0)
+ do
{
pid = waitpid(-1, &status, WNOHANG);
child_manager_sigchild(pid, status);
}
+ while (pid > 0);
sig_child_received = FALSE;
}
}
--
Bazsi
More information about the syslog-ng
mailing list