Avoid setting the stack top below upvalues to be closed

When leaving a scope, the new stack top should be set only after
closing any upvalue, to avoid manipulating values in an "invalid"
part of the stack.
This commit is contained in:
Roberto Ierusalimschy
2019-07-16 14:13:22 -03:00
parent 758c1ef445
commit 298f383ffc
3 changed files with 13 additions and 9 deletions

15
lapi.c
View File

@@ -171,19 +171,20 @@ LUA_API int lua_gettop (lua_State *L) {
LUA_API void lua_settop (lua_State *L, int idx) {
StkId func = L->ci->func;
int diff; /* difference for new top */
lua_lock(L);
if (idx >= 0) {
StkId newtop = (func + 1) + idx;
api_check(L, idx <= L->stack_last - (func + 1), "new top too large");
while (L->top < newtop)
setnilvalue(s2v(L->top++));
L->top = newtop;
api_check(L, idx <= L->ci->top - (func + 1), "new top too large");
diff = (func + 1) + idx - L->top;
for (; diff > 0; diff--)
setnilvalue(s2v(L->top++)); /* clear new slots */
}
else {
api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top");
L->top += idx+1; /* 'subtract' index (index is negative) */
diff = idx + 1; /* will "subtract" index (as it is negative) */
}
luaF_close(L, L->top, LUA_OK);
luaF_close(L, L->top + diff, LUA_OK);
L->top += diff; /* correct top only after closing any upvalue */
lua_unlock(L);
}