diff options
author | Mike Pall <mike> | 2023-09-21 05:19:55 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2023-09-21 05:19:55 +0200 |
commit | d1a2fef8a8f53b0055ee041f7f63d83a27444ffa (patch) | |
tree | ac2d1265b5ed76c90aa9b3dab1c834c50a773234 /src | |
parent | 234dbc481e7c218b7b1fd6777beca33dfeb7b801 (diff) | |
download | luajit-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.h | 2 | ||||
-rw-r--r-- | src/lj_dispatch.c | 2 | ||||
-rw-r--r-- | src/vm_arm64.dasc | 1 | ||||
-rw-r--r-- | src/vm_mips64.dasc | 1 |
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) |