2012-03-12 31 views
6

Tôi đã nhìn thấy nó nói nhiều lần rằng không có cách nào để hạn chế sử dụng bộ nhớ của Lua script, bao gồm cả những người nhảy qua hoops để ngăn chặn Lua script tạo các hàm và bảng. Nhưng cho rằng lua_newstate cho phép bạn vượt qua một cấp phát tùy chỉnh, không ai có thể sử dụng nó để giới hạn mức tiêu thụ bộ nhớ? Tại tồi tệ nhất, người ta có thể sử dụng một phân bổ dựa trên đấu trường và đặt một giới hạn cứng ngay cả trên số lượng bộ nhớ có thể được sử dụng bởi phân mảnh.Hạn chế sử dụng bộ nhớ của tập lệnh Lua?

Tôi có thiếu gì đó ở đây không?

+1

"Tôi đã nhìn thấy nó nói nhiều lần" Hai từ: Trích dẫn cần thiết. –

+0

Trang wiki Lua trên các hộp cát đề cập đến việc sử dụng bộ nhớ như một cuộc tấn công có thể xảy ra nhưng không đề cập đến các cách để hạn chế nó: http://lua-users.org/wiki/SandBoxes. Tôi nghĩ rằng tôi đã đọc sai trang này, nơi nó đang nói về "Looah" không phải Lua: http://www.sk89q.com/2010/03/sandboxed-lua-via-php/ –

+1

"họ luôn mucking xung quanh với cố gắng ngăn chặn việc tạo các hàm hoặc bảng. " Đó là bởi vì họ không muốn họ tạo ra các bảng và chức năng. Họ muốn bảo tồn phạm vi toàn cầu. Đó là một nhiệm vụ khác từ việc ngăn chặn việc sử dụng bộ nhớ. –

Trả lời

9
static void *l_alloc_restricted (void *ud, void *ptr, size_t osize, size_t nsize) 
{ 
    const int MAX_SIZE = 1024; /* set limit here */ 
    int *used = (int *)ud; 

    if(ptr == NULL) { 
    /* 
     * <http://www.lua.org/manual/5.2/manual.html#lua_Alloc>: 
     * When ptr is NULL, osize encodes the kind of object that Lua is 
     * allocating. 
     * 
     * Since we don’t care about that, just mark it as 0. 
     */ 
    osize = 0; 
    } 

    if (nsize == 0) 
    { 
    free(ptr); 
    *used -= osize; /* substract old size from used memory */ 
    return NULL; 
    } 
    else 
    { 
    if (*used + (nsize - osize) > MAX_SIZE) /* too much memory in use */ 
     return NULL; 
    ptr = realloc(ptr, nsize); 
    if (ptr) /* reallocation successful? */ 
     *used += (nsize - osize); 
    return ptr; 
    } 
} 

Để làm Lua sử dụng cấp phát, bạn có thể sử dụng

int *ud = malloc(sizeof(int)); *ud = 0; 
lua_State *L = lua_State *lua_newstate (l_alloc_restricted, ud); 

Lưu ý: Tôi đã không kiểm tra nguồn gốc, nhưng nó phải làm việc.

+0

Cảm ơn, mặc dù những gì tôi đã tự hỏi là lý do tại sao tôi đã không bao giờ nhìn thấy bất cứ ai sử dụng kỹ thuật này; họ luôn luôn mucking xung quanh với cố gắng để ngăn chặn việc tạo ra các chức năng hoặc bảng. –

+0

Bây giờ tôi đã nhìn lại, có vẻ như lý do là mọi người đang cố gắng để mã sandbox từ bên trong Lua. –

+1

Tôi nghĩ rằng int bạn malloc thực sự muốn được zeroed trước khi sử dụng –

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