]> source.dussan.org Git - rspamd.git/commitdiff
Allow single string to be in a string list.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 4 Feb 2015 15:22:01 +0000 (15:22 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 4 Feb 2015 15:22:01 +0000 (15:22 +0000)
src/libserver/cfg_rcl.c

index 6074d637dbbaa33f93a03fc6e97e0919d7c33afa..14ee4acca8c3e019edf607919057eaae7d5a883d 100644 (file)
@@ -1864,41 +1864,49 @@ rspamd_rcl_parse_struct_string_list (struct rspamd_config *cfg,
 
        target = (GList **)(((gchar *)pd->user_struct) + pd->offset);
 
-       if (obj->type != UCL_ARRAY) {
-               g_set_error (err,
-                       CFG_RCL_ERROR,
-                       EINVAL,
-                       "an array of strings is expected");
-               return FALSE;
+       if (obj->type == UCL_STRING) {
+               /* Just a single string */
+               val = rspamd_mempool_strdup (cfg->cfg_pool,
+                       ucl_copy_value_trash (obj));
+               *target = g_list_prepend (*target, val);
        }
-
-       while ((cur = ucl_iterate_object (obj, &iter, true)) != NULL) {
-               switch (cur->type) {
-               case UCL_STRING:
-                       val =
-                               rspamd_mempool_strdup (cfg->cfg_pool,
-                                       ucl_copy_value_trash (cur));
-                       break;
-               case UCL_INT:
-                       val = rspamd_mempool_alloc (cfg->cfg_pool, num_str_len);
-                       rspamd_snprintf (val, num_str_len, "%L", cur->value.iv);
-                       break;
-               case UCL_FLOAT:
-                       val = rspamd_mempool_alloc (cfg->cfg_pool, num_str_len);
-                       rspamd_snprintf (val, num_str_len, "%f", cur->value.dv);
-                       break;
-               case UCL_BOOLEAN:
-                       val = rspamd_mempool_alloc (cfg->cfg_pool, num_str_len);
-                       rspamd_snprintf (val, num_str_len, "%b", (gboolean)cur->value.iv);
-                       break;
-               default:
-                       g_set_error (err,
+       else if (obj->type == UCL_ARRAY) {
+
+               while ((cur = ucl_iterate_object (obj, &iter, true)) != NULL) {
+                       switch (cur->type) {
+                       case UCL_STRING:
+                               val =
+                                               rspamd_mempool_strdup (cfg->cfg_pool,
+                                                               ucl_copy_value_trash (cur));
+                               break;
+                       case UCL_INT:
+                               val = rspamd_mempool_alloc (cfg->cfg_pool, num_str_len);
+                               rspamd_snprintf (val, num_str_len, "%L", cur->value.iv);
+                               break;
+                       case UCL_FLOAT:
+                               val = rspamd_mempool_alloc (cfg->cfg_pool, num_str_len);
+                               rspamd_snprintf (val, num_str_len, "%f", cur->value.dv);
+                               break;
+                       case UCL_BOOLEAN:
+                               val = rspamd_mempool_alloc (cfg->cfg_pool, num_str_len);
+                               rspamd_snprintf (val, num_str_len, "%b", (gboolean)cur->value.iv);
+                               break;
+                       default:
+                               g_set_error (err,
+                                               CFG_RCL_ERROR,
+                                               EINVAL,
+                                               "cannot convert an object or array to string");
+                               return FALSE;
+                       }
+                       *target = g_list_prepend (*target, val);
+               }
+       }
+       else {
+               g_set_error (err,
                                CFG_RCL_ERROR,
                                EINVAL,
-                               "cannot convert an object or array to string");
-                       return FALSE;
-               }
-               *target = g_list_prepend (*target, val);
+                               "an array of strings is expected");
+               return FALSE;
        }
 
        /* Add a destructor */