lua-users home
lua-l archive

Re: Using debugging hooks as a 'watchdog' on code execution?

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


On Jan 4, 2008 12:26 AM, Kurt Nordstrom <kurt@blar.net> wrote:
> However, I am looking for a way to put limits on the code that users can
> run. Namely, I don't want to see somebody kick something off with an
> infinite loop and lock up the entire game.
I had a similiar situation, and took to a solution that looks like this:
void inmlua_hookhandler(lua_State *L, lua_Debug *ar)
{
 char output[256];
 if (ar->event == LUA_HOOKLINE)
 {
 g_inmgame->luacontrol.line_count += 1;
 if ( g_inmgame->luacontrol.line_count >= INM_LUA_MAX_COMMANDS )
 {
 snprintf( output, 255,
 "inmlua_hookhandler: Runaway script detected. [Line:%i]\n",
 ar->currentline );
 output[255] = 0;
 lua_pushstring(L, output );
 lua_error(L);
 }
 }
}
Where I load the script, I perform this initialization:
 /* Prepare New Hook. */
 lua_sethook( L , inmlua_hookhandler, LUA_MASKLINE, 0 );
 g_inmgame->luacontrol.line_count = 0;
The magic number I use is 1000000 lines, which turns out to be about a
second or two from My Machine (tm), which during debugging is about
when I've noticed that there was a problem. This serves as an
all-else-fails way out of something that would likely require killing
by the OS.

AltStyle によって変換されたページ (->オリジナル) /