Вы должны использовать lua_dump()
вместо внутренних toproto()
+ luaU_dump()
функций. В качестве дополнительного бонуса ваш код будет поддерживать LuaJIT 2 .
Нет необходимости воссоздавать состояние каждый раз, когда вы получаете дамп.
НО. Я бы не стал выполнять байт-код Lua, полученный из ненадежного источника (а сервер часто является ненадежным для клиента). Это небезопасно, и может привести к серьезным проблемам безопасности. (Таких проблем с исходным кодом нет, но, конечно, вам все равно придется его помещать в песочницу.)
В общем, всегда убедитесь, что вы проверяете, что код, который вы загружаете из ненадежного источника, не байт-код (если первый байт 27
десятичное число). Всегда выполнить такой код в песочнице .
Если все, что вам нужно, это передавать данные дружественным по отношению к Lua способом, выберите вместо этого подходящую библиотеку сериализации данных. Помимо проблем с песочницей и переносимостью, loadstring()
довольно медленный.
Например, мы используем мою библиотеку luatexts для аналогичных целей (обязательно просмотрите этот список для альтернатив). Luatexts поддерживает кортежи, которые прекрасно работают с вызовами функций. Например (в псевдокоде):
Сервер:
my_send(luatexts.lua.save("myMethod", { param = true }, 42))
Клиент:
local actions = { }
function actions.myMethod(params, number)
print(params.param, number) --> true, 42
end
local function handle_action(ok, name, ...)
assert(ok, name) -- name would contain error message if not OK
local handler = assert(actions[name], "unknown action")
return handler(...)
end
local str = my_receive()
handle_action(luatexts.load(str))
Откройте тикет, если вы хотите luatexts.save
или поддержку потоковой передачи, реализованную в C.