aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2023-09-21 05:19:55 +0200
committerMike Pall <mike>2023-09-21 05:19:55 +0200
commitd1a2fef8a8f53b0055ee041f7f63d83a27444ffa (patch)
treeac2d1265b5ed76c90aa9b3dab1c834c50a773234 /src
parent234dbc481e7c218b7b1fd6777beca33dfeb7b801 (diff)
downloadluajit-d1a2fef8a8f53b0055ee041f7f63d83a27444ffa.tar.gz
luajit-d1a2fef8a8f53b0055ee041f7f63d83a27444ffa.tar.bz2
luajit-d1a2fef8a8f53b0055ee041f7f63d83a27444ffa.zip
LJ_FR2: Fix stack checks in vararg calls.
Thanks to Peter Cawley. #1048
Diffstat (limited to 'src')
-rw-r--r--src/lj_def.h2
-rw-r--r--src/lj_dispatch.c2
-rw-r--r--src/vm_arm64.dasc1
-rw-r--r--src/vm_mips64.dasc1
4 files changed, 4 insertions, 2 deletions
diff --git a/src/lj_def.h b/src/lj_def.h
index 1461d3d7..0d6c346b 100644
--- a/src/lj_def.h
+++ b/src/lj_def.h
@@ -69,7 +69,7 @@ typedef unsigned int uintptr_t;
69#define LJ_MAX_UPVAL 60 /* Max. # of upvalues. */ 69#define LJ_MAX_UPVAL 60 /* Max. # of upvalues. */
70 70
71#define LJ_MAX_IDXCHAIN 100 /* __index/__newindex chain limit. */ 71#define LJ_MAX_IDXCHAIN 100 /* __index/__newindex chain limit. */
72#define LJ_STACK_EXTRA (5+2*LJ_FR2) /* Extra stack space (metamethods). */ 72#define LJ_STACK_EXTRA (5+3*LJ_FR2) /* Extra stack space (metamethods). */
73 73
74#define LJ_NUM_CBPAGE 1 /* Number of FFI callback pages. */ 74#define LJ_NUM_CBPAGE 1 /* Number of FFI callback pages. */
75 75
diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c
index 57809e62..b9748bba 100644
--- a/src/lj_dispatch.c
+++ b/src/lj_dispatch.c
@@ -453,7 +453,7 @@ static int call_init(lua_State *L, GCfunc *fn)
453 int numparams = pt->numparams; 453 int numparams = pt->numparams;
454 int gotparams = (int)(L->top - L->base); 454 int gotparams = (int)(L->top - L->base);
455 int need = pt->framesize; 455 int need = pt->framesize;
456 if ((pt->flags & PROTO_VARARG)) need += 1+gotparams; 456 if ((pt->flags & PROTO_VARARG)) need += 1+LJ_FR2+gotparams;
457 lj_state_checkstack(L, (MSize)need); 457 lj_state_checkstack(L, (MSize)need);
458 numparams -= gotparams; 458 numparams -= gotparams;
459 return numparams >= 0 ? numparams : 0; 459 return numparams >= 0 ? numparams : 0;
diff --git a/src/vm_arm64.dasc b/src/vm_arm64.dasc
index 61a3ba6d..3044a8ac 100644
--- a/src/vm_arm64.dasc
+++ b/src/vm_arm64.dasc
@@ -3916,6 +3916,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3916 | add TMP2, BASE, RC 3916 | add TMP2, BASE, RC
3917 | add LFUNC:CARG3, CARG3, TMP0, lsl #47 3917 | add LFUNC:CARG3, CARG3, TMP0, lsl #47
3918 | add RA, RA, RC 3918 | add RA, RA, RC
3919 | sub CARG1, CARG1, #8
3919 | add TMP0, RC, #16+FRAME_VARG 3920 | add TMP0, RC, #16+FRAME_VARG
3920 | str LFUNC:CARG3, [TMP2], #8 // Store (tagged) copy of LFUNC. 3921 | str LFUNC:CARG3, [TMP2], #8 // Store (tagged) copy of LFUNC.
3921 | ldr KBASE, [PC, #-4+PC2PROTO(k)] 3922 | ldr KBASE, [PC, #-4+PC2PROTO(k)]
diff --git a/src/vm_mips64.dasc b/src/vm_mips64.dasc
index 6c215f2b..ef0d901d 100644
--- a/src/vm_mips64.dasc
+++ b/src/vm_mips64.dasc
@@ -5396,6 +5396,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
5396 | settp LFUNC:RB, TMP0 5396 | settp LFUNC:RB, TMP0
5397 | daddu TMP0, RA, RC 5397 | daddu TMP0, RA, RC
5398 | sd LFUNC:RB, 0(TMP1) // Store (tagged) copy of LFUNC. 5398 | sd LFUNC:RB, 0(TMP1) // Store (tagged) copy of LFUNC.
5399 | daddiu TMP2, TMP2, -8
5399 | daddiu TMP3, RC, 16+FRAME_VARG 5400 | daddiu TMP3, RC, 16+FRAME_VARG
5400 | sltu AT, TMP0, TMP2 5401 | sltu AT, TMP0, TMP2
5401 | ld KBASE, -4+PC2PROTO(k)(PC) 5402 | ld KBASE, -4+PC2PROTO(k)(PC)