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,

Reply via email to