2010-12-29 32 views
8

Tôi đang nhúng Lua (5.1) vào ứng dụng C/C++.LuaL_openlibs() và kịch bản hộp cát

Tôi đang sử dụng chức năng LuaL_openlibs() để tải các lib cơ sở. Tuy nhiên, hàm này tải một số thư viện khác mà tôi muốn vô hiệu hóa để chúng không có sẵn cho các kịch bản lệnh Lua của tôi.

Cụ thể, tôi muốn tắt mô-đun IO và OS. Có một chức năng tôi có thể gọi để programmativally vô hiệu hóa (hoặc dỡ bỏ) các mô-đun này để tôi có thể tạo ra một môi trường sandbox an toàn để chạy Lua script?

Trả lời

8

Tôi không biết làm thế nào để vô hiệu hóa các module, nhưng bạn vẫn có thể chọn mục nào để nạp thay vì tải tất cả chúng với luaL_openlibs. Section 7.3 of the Lua 5.1 manual nói:

Không thể gọi trực tiếp chức năng luaopen_* (để mở thư viện), như chức năng C thông thường. Chúng phải được gọi qua Lua, giống như hàm Lua.

Đó là, thay vì trực tiếp gọi hàm như trong Lua 5.0:

luaopen_table(L); 

... bạn đẩy nó như là một hàm C với tên gọi của nó và sử dụng lua_call hoặc tương tự trong Lua 5.1:

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

Các chức năng bạn có thể làm điều này với được liệt kê trong 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

Tôi nên lưu ý rằng đây là cho lua 5.1, và trong khi nó có thể làm việc với lua 5.2, nó không phải là cách được đề nghị nữa. Điều tốt nhất là nhìn vào tập tin linit.c của bản phân phối lua và xem cách chúng làm điều đó – Aktau

0

Trong các phiên bản cũ hơn của Lua bạn đã sử dụng để có thể chỉ định thư viện nào bạn muốn tải. Cụ thể, trong bản sao của tôi lualib.h tôi thấy các chức năng sau tuyên bố:

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); 

Tôi không thể cho bạn biết những hậu quả của việc không tải tất cả các thư viện, kể từ khi tôi gọi luaL_openlibs() trong mã của tôi. Ấn bản đầu tiên của lập trình trong Lua có sẵn trực tuyến, và đề cập rằng luaL_openlibs() nên thay thế các cuộc gọi hàm luaopen _ *(). Tuy nhiên, các chức năng cũ hơn vẫn có thể được bao gồm cho khả năng tương thích ngược. http://www.lua.org/pil/24.1.html

HTH

12

luaL_openlibs chỉ lặp qua danh sách trình tải thư viện, được khai báo trong cùng một tệp. Chỉ cần xóa/nhận xét ra các đường dây luaopen_ioluaopen_os. Làm xong.

Nếu bạn xấu để chỉnh sửa nguồn Lua, sau đó bạn có thể xác định chức năng của riêng bạn mà lá ra hai thư viện:

#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

cảm ơn câu trả lời (Tôi tha hồ lựa chọn). Có thể đã bỏ phiếu +1 cho câu trả lời này (không may, tôi không thể bỏ phiếu!). Tôi phải chọn câu trả lời của Tùng vì anh ta trả lời đầu tiên với thông tin tương tự. Nhưng tôi đánh giá cao cả hai câu trả lời – skyeagle

9

Giải pháp đơn giản nhất trong số họ tất cả: chỉ cần làm io=nil;os=nil sau khi tải các thư viện .

Các vấn đề liên quan