1. ホーム
  2. lua

[解決済み] Luaスクリプトのメモリ使用量を制限する?

2022-02-14 01:20:08

質問

Luaスクリプトのメモリ使用量を制限する方法はないと何度も言われ、Luaスクリプトが関数やテーブルを作成できないようにする人々もいます。しかし、lua_newstateではカスタムアロケータを渡すことができるので、それを使ってメモリ消費を制限することはできないのでしょうか?最悪の場合、アリーナベースのアロケータを使用し、断片化によって使用される可能性のあるメモリ量にさえ厳しい制限をかけることができるかもしれません。

何か見落としているのでしょうか?

解決方法は?

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

注:ソースのテストはしていませんが、動作するはずです。