Harden deserialize workaround against unexpected input

Otherwise it will stop working entirely soon when the
serialization inside Minetest is reworked.
This allows it to work at least in the cases where the original
bug (LuaJIT register limit) doesn't apply.
This commit is contained in:
sfan5 2022-06-06 20:39:15 +02:00
parent c223ca4cec
commit abc9efeeb8
1 changed files with 6 additions and 3 deletions

View File

@ -114,12 +114,15 @@ function worldedit.serialize(pos1, pos2)
return LATEST_SERIALIZATION_HEADER .. result, count return LATEST_SERIALIZATION_HEADER .. result, count
end end
-- Contains code based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile)
-- by ChillCode, available under the MIT license.
local function deserialize_workaround(content) local function deserialize_workaround(content)
local nodes local nodes
if not minetest.global_exists("jit") then if not minetest.global_exists("jit") then
nodes = minetest.deserialize(content, true) nodes = minetest.deserialize(content, true)
elseif not content:match("^%s*return%s*{") then
-- The data doesn't look like we expect it to so we can't apply the workaround.
-- hope for the best
minetest.log("warning", "WorldEdit: deserializing data but can't apply LuaJIT workaround")
nodes = minetest.deserialize(content, true)
else else
-- XXX: This is a filthy hack that works surprisingly well -- XXX: This is a filthy hack that works surprisingly well
-- in LuaJIT, `minetest.deserialize` will fail due to the register limit -- in LuaJIT, `minetest.deserialize` will fail due to the register limit
@ -130,7 +133,7 @@ local function deserialize_workaround(content)
local startpos, startpos1 = 1, 1 local startpos, startpos1 = 1, 1
local endpos local endpos
while true do -- go through each individual node entry (except the last) while true do -- go through each individual node entry (except the last)
startpos, endpos = escaped:find("},%s*{", startpos) startpos, endpos = escaped:find("}%s*,%s*{", startpos)
if not startpos then if not startpos then
break break
end end