2012-03-12 24 views
6

Lo he visto decir muchas veces que no hay forma de limitar el uso de la memoria de un guion Lua, incluidas las personas saltando a través de aros para evitar que los guiones de Lua creen funciones y tablas. Pero dado que lua_newstate le permite pasar un asignador personalizado, ¿no podría uno simplemente usar eso para limitar el consumo de memoria? En el peor de los casos, uno podría usar un asignador basado en arena y poner un límite estricto incluso en la cantidad de memoria que podría ser utilizada por la fragmentación.¿Limitar el uso de memoria de un guion Lua?

¿Falta algo aquí?

+1

"Lo he visto decir varias veces" Dos palabras: cita requerida. –

+0

La página wiki de Lua en sandboxes menciona el uso de la memoria como un posible ataque, pero no menciona formas de limitarlo: http://lua-users.org/wiki/SandBoxes. Creo que leí mal esta página en la que hablaba de "Looah" y no de Lua: http://www.sk89q.com/2010/03/sandboxed-lua-via-php/ –

+1

"siempre están dando vueltas tratando de prevenir la creación de funciones o tablas ". Eso es porque no quieren que creen tablas y funciones. Quieren preservar el alcance global. Esa es una tarea diferente de solo evitar que se use la memoria. –

Respuesta

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

Para hacer uso de su Lua asignador, puede utilizar

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

Nota: No he probado la fuente, pero debería funcionar.

+0

Gracias, aunque lo que me preguntaba es por qué nunca he visto a nadie usar esta técnica; siempre están tratando de evitar la creación de funciones o tablas. –

+0

Ahora que he vuelto a mirar, parece que la razón es que la gente está intentando codificar el espacio aislado desde Lua. –

+1

Creo que la int. Malloc realmente quiere que se ponga a cero antes de usar –

Cuestiones relacionadas