From 024a6071cac749504e0b26a915bda4f52c41a892 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 18 Jul 2019 11:26:03 -0300 Subject: Small bug with stack reallocation OP_RETURN must update trap before updating stack. (Bug detected with -DHARDSTACKTESTS). Also, in 'luaF_close', do not create a variable with 'uplevel(uv)', as the stack may change and invalidate this value. (This is not a bug, but could become one if 'upl' was used again.) --- lfunc.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'lfunc.c') diff --git a/lfunc.c b/lfunc.c index cd85cc1f..c07e9b35 100644 --- a/lfunc.c +++ b/lfunc.c @@ -202,13 +202,12 @@ void luaF_unlinkupval (UpVal *uv) { int luaF_close (lua_State *L, StkId level, int status) { UpVal *uv; while ((uv = L->openupval) != NULL && uplevel(uv) >= level) { - StkId upl = uplevel(uv); TValue *slot = &uv->u.value; /* new position for value */ - lua_assert(upl < L->top); + lua_assert(uplevel(uv) < L->top); if (uv->tt == LUA_TUPVALTBC && status != NOCLOSINGMETH) { - /* must run closing method */ + /* must run closing method, which may change the stack */ ptrdiff_t levelrel = savestack(L, level); - status = callclosemth(L, upl, status); /* may change the stack */ + status = callclosemth(L, uplevel(uv), status); level = restorestack(L, levelrel); } luaF_unlinkupval(uv); -- cgit v1.2.3-55-g6feb