From 421e459684f7fdf483454d99c048b47783cb0611 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 1 Dec 2017 15:38:49 -0200 Subject: 'luaS_resize' can raise memory errors --- lgc.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lgc.c b/lgc.c index f4b8d6a4..f893e122 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 2.239 2017/11/23 19:29:04 roberto Exp roberto $ +** $Id: lgc.c,v 2.240 2017/11/30 15:37:16 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -816,14 +816,19 @@ static GCObject **sweeptolive (lua_State *L, GCObject **p) { */ /* -** If possible, shrink string table +** If possible, shrink string table (protected from memory errors). */ +static void shrinkstrtable (lua_State *L, void *ud) { + luaS_resize(L, *cast(int*, ud) / 2); +} + + static void checkSizes (lua_State *L, global_State *g) { if (!g->gcemergency) { l_mem olddebt = g->GCdebt; if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ - luaS_resize(L, g->strt.size / 2); /* shrink it a little */ - g->GCestimate += g->GCdebt - olddebt; /* update estimate */ + luaD_rawrunprotected(L, &shrinkstrtable, &g->strt.size); + g->GCestimate += g->GCdebt - olddebt; /* correct estimate */ } } -- cgit v1.2.3-55-g6feb