[syslog-ng] [PATCH (3.5)] affile: Error out when there's a syntax error in the filename template

Gergely Nagy algernon at balabit.hu
Mon Jun 10 16:54:26 CEST 2013


When there is a syntax error in the filename template (eg,
"/var/log/foo-$(+ 0"), error out at config load time. This is done by
adding an error output variable to affile_dd_new_instance() and both
affile_dd_new() and afpipe_dd_new(), then using that to store the result
of log_template_compile(). If that function fails, we bail out early,
and use CHECK_ERROR() in the grammar to notify the user of the issue.

Signed-off-by: Gergely Nagy <algernon at balabit.hu>
---
 modules/affile/affile-dest.c     |   23 +++++++++++++++--------
 modules/affile/affile-dest.h     |    6 +++---
 modules/affile/affile-grammar.ym |   12 +++++++++---
 3 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/modules/affile/affile-dest.c b/modules/affile/affile-dest.c
index c8fa9c1..c9447ce 100644
--- a/modules/affile/affile-dest.c
+++ b/modules/affile/affile-dest.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002-2012 BalaBit IT Ltd, Budapest, Hungary
+ * Copyright (c) 2002-2013 BalaBit IT Ltd, Budapest, Hungary
  * Copyright (c) 1998-2012 Balázs Scheidler
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -703,17 +703,24 @@ affile_dd_free(LogPipe *s)
 }
 
 static AFFileDestDriver *
-affile_dd_new_instance(gchar *filename)
+affile_dd_new_instance(gchar *filename, GError **error)
 {
   AFFileDestDriver *self = g_new0(AFFileDestDriver, 1);
+  LogTemplate *filename_template;
+
+  filename_template = log_template_new(configuration, NULL);
+  if (!log_template_compile(filename_template, filename, error))
+    {
+      log_template_unref(filename_template);
+      return NULL;
+    }
 
   log_dest_driver_init_instance(&self->super);
   self->super.super.super.init = affile_dd_init;
   self->super.super.super.deinit = affile_dd_deinit;
   self->super.super.super.queue = affile_dd_queue;
   self->super.super.super.free_fn = affile_dd_free;
-  self->filename_template = log_template_new(configuration, NULL);
-  log_template_compile(self->filename_template, filename, NULL);
+  self->filename_template = filename_template;
   log_writer_options_defaults(&self->writer_options);
   file_perm_options_defaults(&self->file_perm_options);
   self->writer_options.mark_mode = MM_NONE;
@@ -728,15 +735,15 @@ affile_dd_new_instance(gchar *filename)
 }
 
 LogDriver *
-affile_dd_new(gchar *filename)
+affile_dd_new(gchar *filename, GError **error)
 {
-  return &affile_dd_new_instance(filename)->super.super;
+  return &affile_dd_new_instance(filename, error)->super.super;
 }
 
 LogDriver *
-afpipe_dd_new(gchar *filename)
+afpipe_dd_new(gchar *filename, GError **error)
 {
-  AFFileDestDriver *self = affile_dd_new_instance(filename);
+  AFFileDestDriver *self = affile_dd_new_instance(filename, error);
   self->is_pipe = TRUE;
   return &self->super.super;
 }
diff --git a/modules/affile/affile-dest.h b/modules/affile/affile-dest.h
index 3f4f21b..dcee654 100644
--- a/modules/affile/affile-dest.h
+++ b/modules/affile/affile-dest.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002-2012 BalaBit IT Ltd, Budapest, Hungary
+ * Copyright (c) 2002-2013 BalaBit IT Ltd, Budapest, Hungary
  * Copyright (c) 1998-2012 Balázs Scheidler
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -53,8 +53,8 @@ typedef struct _AFFileDestDriver
   gint time_reap;
 } AFFileDestDriver;
 
-LogDriver *affile_dd_new(gchar *filename);
-LogDriver *afpipe_dd_new(gchar *filename);
+LogDriver *affile_dd_new(gchar *filename, GError **error);
+LogDriver *afpipe_dd_new(gchar *filename, GError **error);
 
 void affile_dd_set_create_dirs(LogDriver *s, gboolean create_dirs);
 void affile_dd_set_fsync(LogDriver *s, gboolean enable);
diff --git a/modules/affile/affile-grammar.ym b/modules/affile/affile-grammar.ym
index abecee4..0d2f099 100644
--- a/modules/affile/affile-grammar.ym
+++ b/modules/affile/affile-grammar.ym
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002-2012 BalaBit IT Ltd, Budapest, Hungary
+ * Copyright (c) 2002-2013 BalaBit IT Ltd, Budapest, Hungary
  * Copyright (c) 1998-2012 Balázs Scheidler
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -144,7 +144,10 @@ dest_affile
 dest_affile_params
 	: string
 	  {
-	    last_driver = *instance = affile_dd_new($1);
+	    GError *error;
+
+	    last_driver = *instance = affile_dd_new($1, &error);
+	    CHECK_ERROR(last_driver, @1, "Error compiling template; %s", error->message);
 	    free($1);
 	    last_writer_options = &((AFFileDestDriver *) last_driver)->writer_options;
 	    last_file_perm_options = &((AFFileDestDriver *) last_driver)->file_perm_options;
@@ -171,7 +174,10 @@ dest_affile_option
 dest_afpipe_params
 	: string
 	  {
-	    last_driver = *instance = afpipe_dd_new($1);
+	    GError *error;
+
+	    last_driver = *instance = afpipe_dd_new($1, &error);
+	    CHECK_ERROR(last_driver, @1, "Error compiling template; %s", error->message);
 	    free($1);
 	    last_writer_options = &((AFFileDestDriver *) last_driver)->writer_options;
 	    last_file_perm_options = &((AFFileDestDriver *) last_driver)->file_perm_options;
-- 
1.7.10.4




More information about the syslog-ng mailing list