Module Name: src Committed By: nikita Date: Mon Apr 17 19:54:19 UTC 2023
Modified Files: src/external/mit/lua/dist/src: lapi.c ldo.c lfunc.c lfunc.h Log Message: lua: aply upstream bugfix for "'lua_settop' may use a pointer to stack invalidated by 'luaF_close'." To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/external/mit/lua/dist/src/lapi.c cvs rdiff -u -r1.10 -r1.11 src/external/mit/lua/dist/src/ldo.c cvs rdiff -u -r1.9 -r1.10 src/external/mit/lua/dist/src/lfunc.c \ src/external/mit/lua/dist/src/lfunc.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/mit/lua/dist/src/lapi.c diff -u src/external/mit/lua/dist/src/lapi.c:1.13 src/external/mit/lua/dist/src/lapi.c:1.14 --- src/external/mit/lua/dist/src/lapi.c:1.13 Sun Apr 16 20:46:17 2023 +++ src/external/mit/lua/dist/src/lapi.c Mon Apr 17 19:54:19 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: lapi.c,v 1.13 2023/04/16 20:46:17 nikita Exp $ */ +/* $NetBSD: lapi.c,v 1.14 2023/04/17 19:54:19 nikita Exp $ */ /* ** Id: lapi.c @@ -208,7 +208,7 @@ LUA_API void lua_settop (lua_State *L, i newtop = L->top + diff; if (diff < 0 && L->tbclist >= newtop) { lua_assert(hastocloseCfunc(ci->nresults)); - luaF_close(L, newtop, CLOSEKTOP, 0); + newtop = luaF_close(L, newtop, CLOSEKTOP, 0); } L->top = newtop; /* correct top only after closing any upvalue */ lua_unlock(L); @@ -221,8 +221,7 @@ LUA_API void lua_closeslot (lua_State *L level = index2stack(L, idx); api_check(L, hastocloseCfunc(L->ci->nresults) && L->tbclist == level, "no variable to close at given level"); - luaF_close(L, level, CLOSEKTOP, 0); - level = index2stack(L, idx); /* stack may be moved */ + level = luaF_close(L, level, CLOSEKTOP, 0); setnilvalue(s2v(level)); lua_unlock(L); } Index: src/external/mit/lua/dist/src/ldo.c diff -u src/external/mit/lua/dist/src/ldo.c:1.10 src/external/mit/lua/dist/src/ldo.c:1.11 --- src/external/mit/lua/dist/src/ldo.c:1.10 Sun Apr 16 20:46:17 2023 +++ src/external/mit/lua/dist/src/ldo.c Mon Apr 17 19:54:19 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: ldo.c,v 1.10 2023/04/16 20:46:17 nikita Exp $ */ +/* $NetBSD: ldo.c,v 1.11 2023/04/17 19:54:19 nikita Exp $ */ /* ** Id: ldo.c @@ -431,14 +431,15 @@ l_sinline void moveresults (lua_State *L break; default: /* two/more results and/or to-be-closed variables */ if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */ - ptrdiff_t savedres = savestack(L, res); L->ci->callstatus |= CIST_CLSRET; /* in case of yields */ L->ci->u2.nres = nres; - luaF_close(L, res, CLOSEKTOP, 1); + res = luaF_close(L, res, CLOSEKTOP, 1); L->ci->callstatus &= ~CIST_CLSRET; - if (L->hookmask) /* if needed, call hook after '__close's */ + if (L->hookmask) { /* if needed, call hook after '__close's */ + ptrdiff_t savedres = savestack(L, res); rethook(L, L->ci, nres); - res = restorestack(L, savedres); /* close and hook can move stack */ + res = restorestack(L, savedres); /* hook can move stack */ + } wanted = decodeNresults(wanted); if (wanted == LUA_MULTRET) wanted = nres; /* we want all results */ @@ -655,8 +656,7 @@ static int finishpcallk (lua_State *L, else { /* error */ StkId func = restorestack(L, ci->u2.funcidx); L->allowhook = getoah(ci->callstatus); /* restore 'allowhook' */ - luaF_close(L, func, status, 1); /* can yield or raise an error */ - func = restorestack(L, ci->u2.funcidx); /* stack may be moved */ + func = luaF_close(L, func, status, 1); /* can yield or raise an error */ luaD_seterrorobj(L, status, func); luaD_shrinkstack(L); /* restore stack size in case of overflow */ setcistrecst(ci, LUA_OK); /* clear original status */ Index: src/external/mit/lua/dist/src/lfunc.c diff -u src/external/mit/lua/dist/src/lfunc.c:1.9 src/external/mit/lua/dist/src/lfunc.c:1.10 --- src/external/mit/lua/dist/src/lfunc.c:1.9 Sun Apr 16 20:46:17 2023 +++ src/external/mit/lua/dist/src/lfunc.c Mon Apr 17 19:54:19 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: lfunc.c,v 1.9 2023/04/16 20:46:17 nikita Exp $ */ +/* $NetBSD: lfunc.c,v 1.10 2023/04/17 19:54:19 nikita Exp $ */ /* ** Id: lfunc.c @@ -227,9 +227,9 @@ static void poptbclist (lua_State *L) { /* ** Close all upvalues and to-be-closed variables up to the given stack -** level. +** level. Return restored 'level'. */ -void luaF_close (lua_State *L, StkId level, int status, int yy) { +StkId luaF_close (lua_State *L, StkId level, int status, int yy) { ptrdiff_t levelrel = savestack(L, level); luaF_closeupval(L, level); /* first, close the upvalues */ while (L->tbclist >= level) { /* traverse tbc's down to that level */ @@ -238,6 +238,7 @@ void luaF_close (lua_State *L, StkId lev prepcallclosemth(L, tbc, status, yy); /* close variable */ level = restorestack(L, levelrel); } + return level; } Index: src/external/mit/lua/dist/src/lfunc.h diff -u src/external/mit/lua/dist/src/lfunc.h:1.9 src/external/mit/lua/dist/src/lfunc.h:1.10 --- src/external/mit/lua/dist/src/lfunc.h:1.9 Sun Apr 16 20:46:17 2023 +++ src/external/mit/lua/dist/src/lfunc.h Mon Apr 17 19:54:19 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: lfunc.h,v 1.9 2023/04/16 20:46:17 nikita Exp $ */ +/* $NetBSD: lfunc.h,v 1.10 2023/04/17 19:54:19 nikita Exp $ */ /* ** Id: lfunc.h @@ -56,7 +56,7 @@ LUAI_FUNC void luaF_initupvals (lua_Stat LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); LUAI_FUNC void luaF_closeupval (lua_State *L, StkId level); -LUAI_FUNC void luaF_close (lua_State *L, StkId level, int status, int yy); +LUAI_FUNC StkId luaF_close (lua_State *L, StkId level, int status, int yy); LUAI_FUNC void luaF_unlinkupval (UpVal *uv); LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,