[syslog-ng] [PATCH (3.5) 2/3] value-pairs: Catch template syntax errors at config time

Gergely Nagy algernon at balabit.hu
Mon Jun 10 17:58:34 CEST 2013


Instead of allowing syntax errors in templates to trigger at runtime,
catch them at config time by verifying the return value of
log_template_compile() and propagating the error message upwards.

Signed-off-by: Gergely Nagy <algernon at balabit.hu>
---
 lib/cfg-grammar.y |   20 ++++++++++++++++++--
 lib/value-pairs.c |   27 ++++++++++++++++++++-------
 lib/value-pairs.h |    7 ++++---
 3 files changed, 42 insertions(+), 12 deletions(-)

diff --git a/lib/cfg-grammar.y b/lib/cfg-grammar.y
index 9505c29..0d6ab2e 100644
--- a/lib/cfg-grammar.y
+++ b/lib/cfg-grammar.y
@@ -1066,8 +1066,24 @@ vp_options
 	;
 
 vp_option
-        : KW_PAIR '(' string ':' string ')'      { value_pairs_add_pair(last_value_pairs, configuration, $3, $5); free($3); free($5); }
-        | KW_PAIR '(' string string ')'          { value_pairs_add_pair(last_value_pairs, configuration, $3, $4); free($3); free($4); }
+        : KW_PAIR '(' string ':' string ')'
+        {
+          GError *error;
+
+          CHECK_ERROR(value_pairs_add_pair(last_value_pairs, configuration, $3, $5, &error),
+                      @5, "Error compiling template; %s", error->message);
+          free($3);
+          free($5);
+        }
+        | KW_PAIR '(' string string ')'
+        {
+          GError *error;
+
+          CHECK_ERROR(value_pairs_add_pair(last_value_pairs, configuration, $3, $4, &error),
+                      @4, "Error compiling template; %s", error->message);
+          free($3);
+          free($4);
+        }
         | KW_KEY '(' string KW_REKEY '('
         {
           last_vp_transset = value_pairs_transform_set_new($3);
diff --git a/lib/value-pairs.c b/lib/value-pairs.c
index 689293c..0a53dc7 100644
--- a/lib/value-pairs.c
+++ b/lib/value-pairs.c
@@ -151,16 +151,28 @@ value_pairs_add_glob_pattern(ValuePairs *vp, const gchar *pattern,
   vp->patterns[i] = p;
 }
 
-void
-value_pairs_add_pair(ValuePairs *vp, GlobalConfig *cfg, const gchar *key, const gchar *value)
+gboolean
+value_pairs_add_pair(ValuePairs *vp, GlobalConfig *cfg, const gchar *key,
+                     const gchar *value, GError **error)
 {
-  VPPairConf *p = g_new(VPPairConf, 1);
+  VPPairConf *p;
+  LogTemplate *template;
+
+  template = log_template_new(cfg, NULL);
+  if (!log_template_compile(template, value, error))
+    {
+      log_template_unref(template);
+      return FALSE;
+    }
+
+  p = g_new(VPPairConf, 1);
 
   p->name = g_strdup(key);
-  p->template = log_template_new(cfg, NULL);
-  log_template_compile(p->template, value, NULL);
+  p->template = template;
 
   g_ptr_array_add(vp->vpairs, p);
+
+  return TRUE;
 }
 
 static gchar *
@@ -730,6 +742,7 @@ vp_cmdline_parse_pair (const gchar *option_name, const gchar *value,
   ValuePairs *vp = (ValuePairs *) args[1];
   GlobalConfig *cfg = (GlobalConfig *) args[0];
   gchar **kv;
+  gboolean success;
 
   vp_cmdline_parse_rekey_finish (data);
   if (!g_strstr_len (value, strlen (value), "="))
@@ -740,13 +753,13 @@ vp_cmdline_parse_pair (const gchar *option_name, const gchar *value,
     }
 
   kv = g_strsplit(value, "=", 2);
-  value_pairs_add_pair (vp, cfg, kv[0], kv[1]);
+  success = value_pairs_add_pair (vp, cfg, kv[0], kv[1], error);
 
   g_free (kv[0]);
   g_free (kv[1]);
   g_free (kv);
 
-  return TRUE;
+  return success;
 }
 
 static ValuePairsTransformSet *
diff --git a/lib/value-pairs.h b/lib/value-pairs.h
index a6c9f34..bddddb5 100644
--- a/lib/value-pairs.h
+++ b/lib/value-pairs.h
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2011-2012 BalaBit IT Ltd, Budapest, Hungary
- * Copyright (c) 2011-2012 Gergely Nagy <algernon at balabit.hu>
+ * Copyright (c) 2011-2013 BalaBit IT Ltd, Budapest, Hungary
+ * Copyright (c) 2011-2013 Gergely Nagy <algernon at balabit.hu>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -41,7 +41,8 @@ typedef gboolean (*VPWalkCallbackFunc)(const gchar *name,
 
 gboolean value_pairs_add_scope(ValuePairs *vp, const gchar *scope);
 void value_pairs_add_glob_pattern(ValuePairs *vp, const gchar *pattern, gboolean include);
-void value_pairs_add_pair(ValuePairs *vp, GlobalConfig *cfg, const gchar *key, const gchar *value);
+gboolean value_pairs_add_pair(ValuePairs *vp, GlobalConfig *cfg, const gchar *key,
+                              const gchar *value, GError **error);
 
 void value_pairs_add_transforms(ValuePairs *vp, gpointer vpts);
 
-- 
1.7.10.4




More information about the syslog-ng mailing list