|
| 1 | +From 3c4209f69e4f0f3810b9acfde263569ef7c0a197 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Mike Pall <mike> |
| 3 | +Date: Tue, 23 Jan 2024 18:58:52 +0100 |
| 4 | +Subject: [PATCH] Fix unsinking of IR_FSTORE for NULL metatable. |
| 5 | + |
| 6 | +Reported by pwnhacker0x18. #1147 |
| 7 | + |
| 8 | +Upstream reference: |
| 9 | +https://github.com/LuaJIT/LuaJIT/commit/85b4fed0b0353dd78c8c875c2f562d522a2b310f |
| 10 | +--- |
| 11 | + src/lj_snap.c | 11 ++++++++--- |
| 12 | + 1 file changed, 8 insertions(+), 3 deletions(-) |
| 13 | + |
| 14 | +diff --git a/src/lj_snap.c b/src/lj_snap.c |
| 15 | +index 4140fdb..d2c454c 100644 |
| 16 | +--- a/src/lj_snap.c |
| 17 | ++++ b/src/lj_snap.c |
| 18 | +@@ -453,6 +453,7 @@ static TRef snap_replay_const(jit_State *J, IRIns *ir) |
| 19 | + case IR_KNUM: case IR_KINT64: |
| 20 | + return lj_ir_k64(J, (IROp)ir->o, ir_k64(ir)->u64); |
| 21 | + case IR_KPTR: return lj_ir_kptr(J, ir_kptr(ir)); /* Continuation. */ |
| 22 | ++ case IR_KNULL: return lj_ir_knull(J, irt_type(ir->t)); |
| 23 | + default: lj_assertJ(0, "bad IR constant op %d", ir->o); return TREF_NIL; |
| 24 | + } |
| 25 | + } |
| 26 | +@@ -882,9 +883,13 @@ static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex, |
| 27 | + if (irk->o == IR_FREF) { |
| 28 | + lj_assertJ(irk->op2 == IRFL_TAB_META, |
| 29 | + "sunk store with bad field %d", irk->op2); |
| 30 | +- snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, &tmp); |
| 31 | +- /* NOBARRIER: The table is new (marked white). */ |
| 32 | +- setgcref(t->metatable, obj2gco(tabV(&tmp))); |
| 33 | ++ if (T->ir[irs->op2].o == IR_KNULL) { |
| 34 | ++ setgcrefnull(t->metatable); |
| 35 | ++ } else { |
| 36 | ++ snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, &tmp); |
| 37 | ++ /* NOBARRIER: The table is new (marked white). */ |
| 38 | ++ setgcref(t->metatable, obj2gco(tabV(&tmp))); |
| 39 | ++ } |
| 40 | + } else { |
| 41 | + irk = &T->ir[irk->op2]; |
| 42 | + if (irk->o == IR_KSLOT) irk = &T->ir[irk->op1]; |
| 43 | +-- |
| 44 | +2.45.4 |
| 45 | + |
0 commit comments