]> source.dussan.org Git - rspamd.git/commitdiff
Avoid endless recursion in export ucl to lua.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 27 Oct 2013 22:02:20 +0000 (22:02 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 27 Oct 2013 22:02:20 +0000 (22:02 +0000)
src/lua/lua_common.h
src/lua/lua_config.c
src/lua/lua_rcl.c

index c878a50f360d6bc02a3d710a099a75027034410a..e2e2f032ab1533249876a03afca2b81318cb6873 100644 (file)
@@ -107,7 +107,7 @@ void free_lua_locked (struct lua_locked_state *st);
  * @param L lua state
  * @param obj object to push
  */
-gint lua_rcl_obj_push (lua_State *L, ucl_object_t *obj);
+gint lua_rcl_obj_push (lua_State *L, ucl_object_t *obj, gboolean allow_array);
 
 /**
  * Extract rcl object from lua object
index df8526d0f6d00a5f8a8bd1398bdf5f426d07ac05..4e8e6eb6d50ea33f4cb9128c7b2ca9180638760d 100644 (file)
@@ -163,7 +163,7 @@ lua_config_get_module_opt (lua_State * L)
                if (mname && optname) {
                        obj = get_module_opt (cfg, mname, optname);
                        if (obj) {
-                               return lua_rcl_obj_push (L, obj);
+                               return lua_rcl_obj_push (L, obj, TRUE);
                        }
                }
        }
@@ -198,7 +198,7 @@ lua_config_get_all_opt (lua_State * L)
                if (mname) {
                        obj = ucl_obj_get_key (cfg->rcl_obj, mname);
                        if (obj != NULL) {
-                               return lua_rcl_obj_push (L, obj);
+                               return lua_rcl_obj_push (L, obj, TRUE);
                        }
                }
        }
index b695f4f11f1dd3aad31a45f587eb562e5ec34cf6..1c03fa62b6fdcea42a7d4b6a09b970db3ee41e11 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 static gint lua_rcl_obj_push_array (lua_State *L, ucl_object_t *obj);
-static gint lua_rcl_obj_push_simple (lua_State *L, ucl_object_t *obj);
+static gint lua_rcl_obj_push_simple (lua_State *L, ucl_object_t *obj, gboolean allow_array);
 static void lua_rcl_table_get (lua_State *L, ucl_object_t *top, gint idx);
 static void lua_rcl_elt_get (lua_State *L, ucl_object_t *top, gint idx);
 
@@ -42,7 +42,7 @@ static void
 lua_rcl_obj_push_elt (lua_State *L, const char *key, ucl_object_t *obj)
 {
        lua_pushstring (L, key);
-       lua_rcl_obj_push (L, obj);
+       lua_rcl_obj_push (L, obj, TRUE);
        lua_settable (L, -3);
 }
 
@@ -85,7 +85,7 @@ lua_rcl_obj_push_array (lua_State *L, ucl_object_t *obj)
        lua_newtable (L);
 
        LL_FOREACH (obj, cur) {
-               lua_rcl_obj_push (L, cur);
+               lua_rcl_obj_push (L, cur, FALSE);
                lua_rawseti (L, -2, i);
                i ++;
        }
@@ -97,9 +97,9 @@ lua_rcl_obj_push_array (lua_State *L, ucl_object_t *obj)
  * Push a simple object to lua depending on its actual type
  */
 static gint
-lua_rcl_obj_push_simple (lua_State *L, ucl_object_t *obj)
+lua_rcl_obj_push_simple (lua_State *L, ucl_object_t *obj, gboolean allow_array)
 {
-       if (obj->next != NULL) {
+       if (allow_array && obj->next != NULL) {
                /* Actually we need to push this as an array */
                return lua_rcl_obj_push_array (L, obj);
        }
@@ -136,7 +136,7 @@ lua_rcl_obj_push_simple (lua_State *L, ucl_object_t *obj)
  * @param obj object to push
  */
 gint
-lua_rcl_obj_push (lua_State *L, ucl_object_t *obj)
+lua_rcl_obj_push (lua_State *L, ucl_object_t *obj, gboolean allow_array)
 {
        switch (obj->type) {
        case UCL_OBJECT:
@@ -144,7 +144,7 @@ lua_rcl_obj_push (lua_State *L, ucl_object_t *obj)
        case UCL_ARRAY:
                return lua_rcl_obj_push_array (L, obj->value.ov);
        default:
-               return lua_rcl_obj_push_simple (L, obj);
+               return lua_rcl_obj_push_simple (L, obj, allow_array);
        }
 }