From: Mike Pall Date: Wed, 14 Aug 2024 22:17:19 +0000 (+0200) Subject: Different fix for partial snapshot restore due to stack overflow. X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=86e7123bb1782a5f200ba5e83b8c4f3fbad4f7bc;p=thirdparty%2FLuaJIT.git Different fix for partial snapshot restore due to stack overflow. Reported by Junlong Li. Fixed by Peter Cawley. #1196 --- diff --git a/src/lj_snap.c b/src/lj_snap.c index 9858c110..0c317b52 100644 --- a/src/lj_snap.c +++ b/src/lj_snap.c @@ -873,7 +873,8 @@ const BCIns *lj_snap_restore(jit_State *J, void *exptr) lua_State *L = J->L; /* Set interpreter PC to the next PC to get correct error messages. */ - setcframe_pc(cframe_raw(L->cframe), pc+1); + setcframe_pc(L->cframe, pc+1); + setcframe_pc(cframe_raw(cframe_prev(L->cframe)), pc); /* Make sure the stack is big enough for the slots from the snapshot. */ if (LJ_UNLIKELY(L->base + snap->topslot >= tvref(L->maxstack))) { diff --git a/src/lj_trace.c b/src/lj_trace.c index 8385f3d1..d015f2ab 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c @@ -788,10 +788,8 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) exd.J = J; exd.exptr = exptr; errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); - if (errcode) { - setcframe_pc(cframe_raw(L->cframe), L); /* Point to any valid memory. */ + if (errcode) return -errcode; /* Return negated error code. */ - } lj_vmevent_send(L, TEXIT, lj_state_checkstack(L, 4+RID_NUM_GPR+RID_NUM_FPR+LUA_MINSTACK);