[syslog-ng] [PATCH] logrewrite: Correctly initialize the conditional rules.

Gergely Nagy algernon at balabit.hu
Fri Dec 2 13:29:42 CET 2011


In case where the condition of a rewrite used a filter reference
instead of inlining the filter itself, the filter expression was never
initialized. This resulted in the condition always evaluating to
not-match, making the following construct completely useless:

 rewrite("new-value", value("MESSAGE"), condition(filter(f_my_filter)))

The fix is to introduce a new function, log_rewrite_init_method(),
which will initialize the condition filter if it exists, and has an
init method. Then we bind this method to LogPipe's init callback
during log_rewrite_init().

This way, when initializing the rewrite pipe, the condition will get
initialised too.

Reported-by: Thomas Wollner <tw at wollner-net.de>
Signed-off-by: Gergely Nagy <algernon at balabit.hu>
---
 lib/logrewrite.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/lib/logrewrite.c b/lib/logrewrite.c
index a578439..3ff245a 100644
--- a/lib/logrewrite.c
+++ b/lib/logrewrite.c
@@ -75,6 +75,17 @@ log_rewrite_free_method(LogPipe *s)
   log_process_pipe_free_method(s);
 }
 
+static gboolean
+log_rewrite_init_method(LogPipe *s)
+{
+  LogRewrite *self = (LogRewrite *) s;
+
+  if (self->condition && self->condition->init)
+    self->condition->init(self->condition, log_pipe_get_config(s));
+
+  return TRUE;
+}
+
 static void
 log_rewrite_init(LogRewrite *self)
 {
@@ -83,6 +94,7 @@ log_rewrite_init(LogRewrite *self)
   self->super.super.flags |= PIF_CLONE;
   self->super.super.free_fn = log_rewrite_free_method;
   self->super.super.queue = log_rewrite_queue;
+  self->super.super.init = log_rewrite_init_method;
   self->value_handle = LM_V_MESSAGE;
 }
 
-- 
1.7.7.3




More information about the syslog-ng mailing list