保护应用程序免受错误的Lua脚本

时间:2018-07-12 11:16:16

标签: c lua microcontroller rtos

我在微控制器项目中使用Lua。 我的软件使用RTOS,并从其他任务中使用appart,它还调用用户提供的Lua脚本。

该脚本必须具有两个功能:init函数和run函数。我的应用程序在初始化期间调用init函数,然后定期调用run函数。

我加载脚本的方式与dofile()非常相似。

需要返回run函数。这样,基础线程就可以为其他优先级较低的线程提供处理器。

所以问题是,在我有机会调用所需功能之前,如何保护系统免受用户提供“危险”脚本(即从未完成其初始执行的脚本)的伤害。 请参阅以下内容:

function init
    --Do some stuff.
end

function run
    --Do some other stuff.
end

while (true) do
    --Do nasty stuff, without ever returning.
end

在上面的示例中,代码在脚本的初始加载期间被阻止,并且从不返回。我从来没有机会调用initrun函数。我如何发现这种情况,以及如何得到保护?

修改 忘了提。我正在使用Lua 5.2.2。

2 个答案:

答案 0 :(得分:1)

设置行挂钩或计数挂钩,如果超过限制则中止。

答案 1 :(得分:0)

解决方案是将用户脚本的执行推迟到WD准备就绪为止。


我们假设这是用户脚本:
user_script.lua

function init()
   --Do some stuff.
end

function run()
   --Do some other stuff.
end

while (true) do
   --Do nasty stuff, without ever returning.
end

您在主机应用程序中正在做什么(就像它是在Lua上编写的一样)

dofile("user_script.lua")

init_watchdog()

init()

run()
run()

您应在主机应用程序中做什么

local user_script_as_text = read_content_of_file("user_script.lua")
assert(loadstring(
[[
   function init()  -- this is your wrapper around user script
      init = nil
      do
         ]]..user_script_as_text..
[[  
      end
      init()  -- invoking "init" defined by user
   end
]]
))()

init_watchdog()

init()  -- invoking your wrapper

run()
run()

如果您需要在打开WD之前读取一些配置变量的值,则必须将这些配置变量作为易于解析的字符串提供,例如以下var1=42,var2=on,var3="Hi"。这些配置变量不能放在Lua脚本中,因为Lua脚本可能会永远循环。
换句话说,您需要来自用户的两个文件: user_config_vars.json user_script.lua