]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Handle OOM error on stack resize in coroutine.resume and lua_checkstack.
authorMike Pall <mike>
Thu, 21 Sep 2023 02:40:48 +0000 (04:40 +0200)
committerMike Pall <mike>
Thu, 21 Sep 2023 02:40:48 +0000 (04:40 +0200)
Thanks to Peter Cawley. #1066

src/lib_base.c
src/lj_api.c
src/lj_state.c
src/lj_state.h

index dd54b9f93085ff76d6483e77621db5900c84d9fb..4e6f8a30378e252968238f5f6c17032704eea6e8 100644 (file)
@@ -616,7 +616,10 @@ static int ffh_resume(lua_State *L, lua_State *co, int wrap)
     setstrV(L, L->base-LJ_FR2, lj_err_str(L, em));
     return FFH_RES(2);
   }
-  lj_state_growstack(co, (MSize)(L->top - L->base));
+  if (lj_state_cpgrowstack(co, (MSize)(L->top - L->base)) != LUA_OK) {
+    cTValue *msg = --co->top;
+    lj_err_callermsg(L, strVdata(msg));
+  }
   return FFH_RETRY;
 }
 
index 386bcada150d5565a835af8d4278004abb301230..d4048d794575b64678a7e0f8e51d81c497edeb34 100644 (file)
@@ -104,7 +104,12 @@ LUA_API int lua_checkstack(lua_State *L, int size)
   if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK) {
     return 0;  /* Stack overflow. */
   } else if (size > 0) {
-    lj_state_checkstack(L, (MSize)size);
+    int avail = (int)(mref(L->maxstack, TValue) - L->top);
+    if (size > avail &&
+       lj_state_cpgrowstack(L, (MSize)(size - avail)) != LUA_OK) {
+      L->top--;
+      return 0;  /* Out of memory. */
+    }
   }
   return 1;
 }
index 6b3f58ff4fe0ffac906274c019f36ac7eb3ed15b..569e3f38075b7f726c569c2601fd9137b4490102 100644 (file)
@@ -130,6 +130,18 @@ void LJ_FASTCALL lj_state_growstack1(lua_State *L)
   lj_state_growstack(L, 1);
 }
 
+static TValue *cpgrowstack(lua_State *co, lua_CFunction dummy, void *ud)
+{
+  UNUSED(dummy);
+  lj_state_growstack(co, *(MSize *)ud);
+  return NULL;
+}
+
+int LJ_FASTCALL lj_state_cpgrowstack(lua_State *L, MSize need)
+{
+  return lj_vm_cpcall(L, NULL, &need, cpgrowstack);
+}
+
 /* Allocate basic stack for new state. */
 static void stack_init(lua_State *L1, lua_State *L)
 {
index db67f03bfbb72d56eb6d2a03b5a035bc44fefd76..3850e5a1851115a04b75374f52747a303c30a557 100644 (file)
@@ -18,6 +18,7 @@ LJ_FUNC void lj_state_relimitstack(lua_State *L);
 LJ_FUNC void lj_state_shrinkstack(lua_State *L, MSize used);
 LJ_FUNCA void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need);
 LJ_FUNC void LJ_FASTCALL lj_state_growstack1(lua_State *L);
+LJ_FUNC int LJ_FASTCALL lj_state_cpgrowstack(lua_State *L, MSize need);
 
 static LJ_AINLINE void lj_state_checkstack(lua_State *L, MSize need)
 {