diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2008-08-05 16:25:42 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2008-08-05 16:25:42 -0300 |
commit | bb48f456d92077e431af489c87031373c916463a (patch) | |
tree | ce0d322e336aa67b4c7831d6740041c6ccc0911d | |
parent | df802dc74b12f0cdee1df0ec119a21022a94545a (diff) | |
download | lua-bb48f456d92077e431af489c87031373c916463a.tar.gz lua-bb48f456d92077e431af489c87031373c916463a.tar.bz2 lua-bb48f456d92077e431af489c87031373c916463a.zip |
bug: 'module' now checks that is caller is a Lua function
-rw-r--r-- | loadlib.c | 13 |
1 files changed, 8 insertions, 5 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: loadlib.c,v 1.58 2007/06/21 13:52:27 roberto Exp roberto $ | 2 | ** $Id: loadlib.c,v 1.59 2007/12/12 14:36:12 roberto Exp roberto $ |
3 | ** Dynamic library loader for Lua | 3 | ** Dynamic library loader for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | ** | 5 | ** |
@@ -521,11 +521,14 @@ static int ll_require (lua_State *L) { | |||
521 | 521 | ||
522 | static void setfenv (lua_State *L) { | 522 | static void setfenv (lua_State *L) { |
523 | lua_Debug ar; | 523 | lua_Debug ar; |
524 | lua_getstack(L, 1, &ar); | 524 | if (lua_getstack(L, 1, &ar) == 0 || |
525 | lua_getinfo(L, "f", &ar); | 525 | lua_getinfo(L, "f", &ar) == 0 || /* get calling function */ |
526 | lua_pushvalue(L, -2); | 526 | lua_iscfunction(L, -1)) |
527 | luaL_error(L, "function " LUA_QL("module") | ||
528 | " not called from a Lua function"); | ||
529 | lua_pushvalue(L, -2); /* copy new environment table to top */ | ||
527 | lua_setfenv(L, -2); | 530 | lua_setfenv(L, -2); |
528 | lua_pop(L, 1); | 531 | lua_pop(L, 1); /* remove function */ |
529 | } | 532 | } |
530 | 533 | ||
531 | 534 | ||