限制 Lua 脚本的内存使用?

我多次看到有人说没有办法限制Lua脚本的内存使用,甚至有人费尽心思防止Lua脚本创建函数和表。但是,考虑到lua_newstate允许你传递自定义分配器,难道不能利用它来限制内存消耗吗?最坏的情况下,可以使用基于区域的分配器,并在片段使用的内存量上设置硬限制。我错过了什么吗?

原文链接 https://stackoverflow.com/questions/9671793

点赞
stackoverflow用户870079
stackoverflow用户870079
static void *l_alloc_restricted (void *ud, void *ptr, size_t osize, size_t nsize)
{
   const int MAX_SIZE = 1024; /* 在此设置限制 */
   int *used = (int *)ud;

   if(ptr == NULL) {
     /*
      * <http://www.lua.org/manual/5.2/manual.html#lua_Alloc>:
      * 当 ptr 为 NULL 时,osize 编码了 Lua 正在分配的对象的类型。
      *
      * 由于我们不关心它,将其标记为 0。
      */
     osize = 0;
   }

   if (nsize == 0)
   {
     free(ptr);
     *used -= osize; /* 从已使用的内存中减去旧尺寸 */
     return NULL;
   }
   else
   {
     if (*used + (nsize - osize) > MAX_SIZE) /* 使用的内存太多了 */
       return NULL;
     ptr = realloc(ptr, nsize);
     if (ptr) /* 重新分配成功? */
       *used += (nsize - osize);
     return ptr;
   }
}

要使 Lua 使用您的分配器,可以使用

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

注意:我还没有测试源代码,但它应该可以工作。

2012-03-12 17:52:11