|
@@ -817,6 +817,17 @@ static int lua_error_handler(lua_State *L)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void * lua_allocator(void *ud, void *ptr, size_t osize, size_t nsize) {
|
|
|
+
|
|
|
+ (void)ud; (void)osize; /* not used */
|
|
|
+
|
|
|
+ if (nsize == 0) {
|
|
|
+ mg_free(ptr);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ return mg_realloc(ptr, nsize);
|
|
|
+}
|
|
|
+
|
|
|
void mg_exec_lua_script(struct mg_connection *conn, const char *path,
|
|
|
const void **exports)
|
|
|
{
|
|
@@ -827,7 +838,7 @@ void mg_exec_lua_script(struct mg_connection *conn, const char *path,
|
|
|
conn->must_close=1;
|
|
|
|
|
|
/* Execute a plain Lua script. */
|
|
|
- if (path != NULL && (L = luaL_newstate()) != NULL) {
|
|
|
+ if (path != NULL && (L = lua_newstate(lua_allocator, NULL)) != NULL) {
|
|
|
prepare_lua_environment(conn, L, path, LUA_ENV_TYPE_PLAIN_LUA_PAGE);
|
|
|
lua_pushcclosure(L, &lua_error_handler, 0);
|
|
|
|
|
@@ -885,7 +896,7 @@ struct file *filep, struct lua_State *ls)
|
|
|
fileno(filep->fp), 0)) == MAP_FAILED) {
|
|
|
lsp_send_err(conn, ls, "mmap(%s, %zu, %d): %s", path, (size_t) filep->size,
|
|
|
fileno(filep->fp), strerror(errno));
|
|
|
- } else if ((L = ls != NULL ? ls : luaL_newstate()) == NULL) {
|
|
|
+ } else if ((L = ls != NULL ? ls : lua_newstate(lua_allocator, NULL)) == NULL) {
|
|
|
send_http_error(conn, 500, http_500_error, "%s", "luaL_newstate failed");
|
|
|
} else {
|
|
|
/* We're not sending HTTP headers here, Lua page must do it. */
|
|
@@ -978,7 +989,7 @@ static void * lua_websocket_new(const char * script, struct mg_connection *conn,
|
|
|
lws_data->shared = is_shared;
|
|
|
lws_data->conn = conn;
|
|
|
lws_data->script = mg_strdup(script);
|
|
|
- lws_data->main = luaL_newstate();
|
|
|
+ lws_data->main = lua_newstate(lua_allocator, NULL);
|
|
|
if (is_shared) {
|
|
|
(void)pthread_mutex_lock(&conn->ctx->mutex);
|
|
|
shared_websock_list = &(conn->ctx->shared_lua_websockets);
|