]> source.dussan.org Git - rspamd.git/commitdiff
Fix implicit arrays handling in string list parsing.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 20 Mar 2015 15:16:40 +0000 (15:16 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 20 Mar 2015 15:16:40 +0000 (15:16 +0000)
src/libserver/cfg_rcl.c

index 21dff7dd1726b90f0325ba18738671fa4ba1431e..69d11f756adb8568955ae5d9026b9ea4516fec90 100644 (file)
@@ -1879,44 +1879,37 @@ rspamd_rcl_parse_struct_string_list (struct rspamd_config *cfg,
 
        target = (GList **)(((gchar *)pd->user_struct) + pd->offset);
 
-       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);
-       }
-       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);
+       iter = ucl_object_iterate_new (obj);
+
+       while ((cur = ucl_object_iterate_safe (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 {
+
+       if (*target == NULL) {
                g_set_error (err,
                                CFG_RCL_ERROR,
                                EINVAL,