diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-08-10 13:23:19 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-08-10 13:23:19 -0300 |
| commit | bc439e21cd262af69ae5988b3c0067e87d9b9230 (patch) | |
| tree | 06170fbc325faaa64d142490a98a77450e482020 | |
| parent | 1b4480003b1bfa7e1d34e587ebd19a9de63c6467 (diff) | |
| download | lua-bc439e21cd262af69ae5988b3c0067e87d9b9230.tar.gz lua-bc439e21cd262af69ae5988b3c0067e87d9b9230.tar.bz2 lua-bc439e21cd262af69ae5988b3c0067e87d9b9230.zip | |
avoid an unprotected call to 'lua_tostring' which theoretically may
cause a panicked exit
| -rw-r--r-- | lua.c | 16 |
1 files changed, 14 insertions, 2 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.c,v 1.173 2009/06/18 18:59:58 roberto Exp roberto $ | 2 | ** $Id: lua.c,v 1.174 2009/07/15 17:35:20 roberto Exp roberto $ |
| 3 | ** Lua stand-alone interpreter | 3 | ** Lua stand-alone interpreter |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -75,6 +75,18 @@ static int report (lua_State *L, int status) { | |||
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | 77 | ||
| 78 | /* the next function is called unprotected, so it must avoid errors */ | ||
| 79 | static void finalreport (lua_State *L, int status) { | ||
| 80 | if (status != LUA_OK) { | ||
| 81 | const char *msg = (lua_type(L, -1) == LUA_TSTRING) ? lua_tostring(L, -1) | ||
| 82 | : NULL; | ||
| 83 | if (msg == NULL) msg = "(error object is not a string)"; | ||
| 84 | l_message(progname, msg); | ||
| 85 | lua_pop(L, 1); | ||
| 86 | } | ||
| 87 | } | ||
| 88 | |||
| 89 | |||
| 78 | static int traceback (lua_State *L) { | 90 | static int traceback (lua_State *L) { |
| 79 | const char *msg = lua_tostring(L, 1); | 91 | const char *msg = lua_tostring(L, 1); |
| 80 | if (msg) | 92 | if (msg) |
| @@ -383,7 +395,7 @@ int main (int argc, char **argv) { | |||
| 383 | s.argc = argc; | 395 | s.argc = argc; |
| 384 | s.argv = argv; | 396 | s.argv = argv; |
| 385 | status = lua_cpcall(L, &pmain, &s); | 397 | status = lua_cpcall(L, &pmain, &s); |
| 386 | report(L, status); | 398 | finalreport(L, status); |
| 387 | lua_close(L); | 399 | lua_close(L); |
| 388 | return (s.ok && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; | 400 | return (s.ok && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; |
| 389 | } | 401 | } |
