Add maximum recursion depth to read_json_value
authorShadowNinja <shadowninja@minetest.net>
Sat, 11 Jan 2014 19:08:02 +0000 (14:08 -0500)
committerShadowNinja <shadowninja@minetest.net>
Sat, 11 Jan 2014 19:08:02 +0000 (14:08 -0500)
src/script/common/c_content.cpp
src/script/common/c_content.h

index 962391a04280cb9c4f6e6e17f712e07ea1f93969..c4acb7c32e48969fc869cccb40fc9275e1fb4f8b 100644 (file)
@@ -1088,8 +1088,11 @@ bool push_json_value(lua_State *L, const Json::Value &value, int nullindex)
 }
 
 // Converts Lua table --> JSON
-void read_json_value(lua_State *L, Json::Value &root, int index)
+void read_json_value(lua_State *L, Json::Value &root, int index, u8 recursion)
 {
+       if (recursion > 16) {
+               throw SerializationError("Maximum recursion depth exceeded");
+       }
        int type = lua_type(L, index);
        if (type == LUA_TBOOLEAN) {
                root = (bool) lua_toboolean(L, index);
@@ -1104,7 +1107,7 @@ void read_json_value(lua_State *L, Json::Value &root, int index)
                while (lua_next(L, index)) {
                        // Key is at -2 and value is at -1
                        Json::Value value;
-                       read_json_value(L, value, lua_gettop(L));
+                       read_json_value(L, value, lua_gettop(L), recursion + 1);
 
                        Json::ValueType roottype = root.type();
                        int keytype = lua_type(L, -1);
index c2d84ac11d7616611f31686f90c12d29271a4ca5..163e803dba0ca3a65c92d5316d3e7de7f4118e94 100644 (file)
@@ -152,7 +152,8 @@ bool               push_json_value           (lua_State *L,
                                               int nullindex);
 void               read_json_value           (lua_State *L,
                                               Json::Value &root,
-                                              int index);
+                                              int index,
+                                              u8 recursion = 0);
 
 extern struct EnumString es_TileAnimationType[];