2010-12-29 10 views
8

Osadzam Lua (5.1) w aplikacji C/C++.LuaL_openlibs() i skrypty piaskownicy

Używam funkcji LuaL_openlibs() do ładowania podstawowych bibliotek. Jednak ta funkcja ładuje inne biblioteki, które chcę wyłączyć, aby nie były dostępne dla moich skryptów Lua.

W szczególności chcę wyłączyć moduły IO i OS. Czy istnieje funkcja, którą mogę wywołać programowo wyłączać (lub rozładowywać) te moduły, aby utworzyć bezpieczne środowisko piaskownicy do uruchamiania skryptów Lua?

Odpowiedz

8

nie wiem jak wyłączyć moduły, ale nadal można wybrać, które z nich załadować zamiast umieszczania ich wszystkich z luaL_openlibs. Section 7.3 of the Lua 5.1 manual mówi:

W luaopen_* funkcje (w celu otwarcia biblioteki) nie może być wywołana bezpośrednio, jak zwykła funkcja C. Muszą zostać wezwani przez Lua, jak funkcja Lua.

Oznacza to, że zamiast bezpośredniego wywoływania funkcji jak w Lua 5.0:

luaopen_table(L); 

... pchasz go jako funkcji C z nazwy i użyć lua_call lub podobny w Lua 5.1:

lua_pushcfunction(L, luaopen_table); 
lua_pushliteral(L, LUA_TABLIBNAME); 
lua_call(L, 1, 0); 

funkcje można to zrobić znajdują się w lualib.h:

Function  | Name 
----------------+----------------- 
luaopen_base | "" 
luaopen_table | LUA_TABLIBNAME 
luaopen_io  | LUA_IOLIBNAME 
luaopen_os  | LUA_OSLIBNAME 
luaopen_string | LUA_STRLIBNAME 
luaopen_math | LUA_MATHLIBNAME 
luaopen_debug | LUA_DBLIBNAME 
luaopen_package | LUA_LOADLIBNAME 
+0

Należy zauważyć, że jest to dla lua 5.1, i chociaż może działać z lua 5.2, nie jest to już zalecany sposób. Najlepiej jest przejrzeć plik linit.c z dystrybucji lua i zobaczyć, jak to robią. – Aktau

0

W starszych wersjach Lua można było określić, które biblioteki chcesz załadować. W szczególności, w moim egzemplarzu z lualib.h widzę następujące funkcje oświadczył:

LUALIB_API int (luaopen_base) (lua_State *L); 
LUALIB_API int (luaopen_table) (lua_State *L); 
LUALIB_API int (luaopen_io) (lua_State *L); 
LUALIB_API int (luaopen_os) (lua_State *L); 
LUALIB_API int (luaopen_string) (lua_State *L); 
LUALIB_API int (luaopen_math) (lua_State *L); 
LUALIB_API int (luaopen_debug) (lua_State *L); 
LUALIB_API int (luaopen_package) (lua_State *L); 
LUALIB_API void (luaL_openlibs) (lua_State *L); 

nie mogę powiedzieć konsekwencje nie ładuje wszystkie biblioteki, ponieważ nazywam luaL_openlibs() w moim kodu. Pierwsza edycja programu w Lua jest dostępna online i wspomina, że ​​luaL_openlibs() powinno zastąpić wywołania funkcji luaopen _ *(). Jednak starsze funkcje mogą nadal być włączone ze względu na kompatybilność wsteczną. http://www.lua.org/pil/24.1.html

HTH

12

luaL_openlibs tylko iteruje listę ładowanych bibliotek, zadeklarowaną w tym samym pliku. Po prostu usuń/skomentuj linie luaopen_io i luaopen_os. Gotowe.

Jeśli jesteś niekorzystne do edycji źródła Lua, to można zdefiniować własną funkcję, która pomija te dwie biblioteki:

#define LUA_LIB 

#include "lua.h" 
#include "lualib.h" 
#include "lauxlib.h" 

static const luaL_Reg lualibs[] = { 
    {"", luaopen_base}, 
    {LUA_LOADLIBNAME, luaopen_package}, 
    {LUA_TABLIBNAME, luaopen_table}, 
    {LUA_STRLIBNAME, luaopen_string}, 
    {LUA_MATHLIBNAME, luaopen_math}, 
    {LUA_DBLIBNAME, luaopen_debug}, 
    {NULL, NULL} 
}; 

LUALIB_API void my_openlibs (lua_State *L) { 
    const luaL_Reg *lib = lualibs; 
    for (; lib->func; lib++) { 
    lua_pushcfunction(L, lib->func); 
    lua_pushstring(L, lib->name); 
    lua_call(L, 1, 0); 
    } 
} 
+0

dzięki za odpowiedź (jestem zepsuty z wyboru). Głosowałbym za odpowiedź +1 (niestety nie mogę głosować!). Musiałem wybrać odpowiedź Tunga, ponieważ odpowiedział najpierw z podobnymi informacjami. Ale doceniam obie odpowiedzi – skyeagle

9

najprostsze rozwiązanie ich wszystkich: Po prostu zrób io=nil;os=nil po załadowaniu biblioteki .