]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Properly fix pointer diff in string.find().
authorMike Pall <mike>
Sat, 21 Dec 2019 12:52:47 +0000 (13:52 +0100)
committerMike Pall <mike>
Sat, 21 Dec 2019 12:52:47 +0000 (13:52 +0100)
Thanks to Vyacheslav Egorov.

src/lj_ffrecord.c

index cb374beb4237f63ce41a4a36fc9b23f14c38cb16..c673d650139879c654e6baad65f55437bbb4fd18 100644 (file)
@@ -949,8 +949,8 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
                    str->len-(MSize)start, pat->len)) {
       TRef pos;
       emitir(IRTG(IR_NE, IRT_PGC), tr, trp0);
-      /* Don't use STRREF of trstr. We need a pointer diff. */
-      pos = emitir(IRTI(IR_SUB), emitir(IRTI(IR_SUB), tr, trstr), lj_ir_kint(J, sizeof(GCstr)));
+      /* Recompute offset. trsptr may not point into trstr after folding. */
+      pos = emitir(IRTI(IR_ADD), emitir(IRTI(IR_SUB), tr, trsptr), trstart);
       J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1));
       J->base[1] = emitir(IRTI(IR_ADD), pos, trplen);
       rd->nres = 2;