Ограничение использования памяти скриптом Lua? - PullRequest
8 голосов
/ 12 марта 2012

Я неоднократно говорил, что нет способа ограничить использование памяти скриптом Lua, включая людей, которые прыгают через обручи, чтобы скрипты Lua не могли создавать функции и таблицы.Но учитывая, что lua_newstate позволяет вам передавать пользовательский распределитель, нельзя ли просто использовать это для ограничения потребления памяти?В худшем случае можно использовать распределитель на основе арены и установить жесткое ограничение даже на количество памяти, которое может быть использовано при фрагментации.

Я что-то здесь упускаю?

1 Ответ

10 голосов
/ 12 марта 2012
 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);

Примечание: я не проверял источник, но он должен работать.

...