diff options
| author | electrodude <electrodude512@gmail.com> | 2016-04-20 18:09:38 -0400 | 
|---|---|---|
| committer | Jeija <norrepli@gmail.com> | 2016-04-26 20:40:12 +0200 | 
| commit | 6cae381c2788d2e4061c530cc143ca38bd0862e3 (patch) | |
| tree | 04c2657302826e3a464ba7f92b87a2c374f06d2f /mesecons_luacontroller | |
| parent | 4249ed4986fd614019c0350de1808041b15a32cc (diff) | |
Luacontroller: Fix `remove_functions` stack overflow bug
Diffstat (limited to 'mesecons_luacontroller')
| -rw-r--r-- | mesecons_luacontroller/init.lua | 30 | 
1 files changed, 21 insertions, 9 deletions
| diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua index e669f93..01f5878 100644 --- a/mesecons_luacontroller/init.lua +++ b/mesecons_luacontroller/init.lua @@ -229,23 +229,35 @@ end  local function remove_functions(x)  	local tp = type(x) -	if tp == "table" then +	if tp == "function" then +		return nil +	end + +	-- Make sure to not serialize the same table multiple times, otherwise +	-- writing mem.test = mem in the LuaController will lead to infinite recursion +	local seen = {} + +	local function rfuncs(x) +		if seen[x] then return end +		seen[x] = true +		if type(x) ~= "table" then return end +  		for key, value in pairs(x) do -			local key_t, val_t = type(key), type(value) -			if key_t == "function" or val_t == "function" then +			if type(key) == "function" or type(value) == "function" then  				x[key] = nil  			else -				if key_t == "table" then -					remove_functions(key) +				if type(key) == "table" then +					rfuncs(key)  				end -				if val_t == "table" then -					remove_functions(value) +				if type(value) == "table" then +					rfuncs(value)  				end  			end  		end -	elseif tp == "function" then -		return nil  	end + +	rfuncs(x) +  	return x  end | 
