限制Lua脚本的内存使用量?

时间:2012-03-12 17:23:59

标签: lua sandbox

我已经多次说过,没有办法限制Lua脚本的内存使用,包括人们跳过篮球以防止Lu​​a脚本创建函数和表。但鉴于lua_newstate允许您传递自定义分配器,是否只能用它来限制内存消耗?在最坏的情况下,人们可以使用基于竞技场的分配器,甚至对碎片可以使用的内存量设置硬限制。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:10)

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

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

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

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