From: Cyrill Gorcunov <gorcunov@gmail.com> To: tml <tarantool-patches@freelists.org> Cc: Alexander Turenko <alexander.turenko@tarantool.org>, Kirill Yukhin <kyukhin@tarantool.org> Subject: [tarantool-patches] [PATCH 1/3] Fix overflow of snapshot map offset. Date: Sat, 18 May 2019 15:33:54 +0300 [thread overview] Message-ID: <20190518123356.15780-2-gorcunov@gmail.com> (raw) In-Reply-To: <20190518123356.15780-1-gorcunov@gmail.com> From: Mike Pall <mike> Thanks to Yichun Zhang. backport https://github.com/openresty/luajit2/commit/380e4409a70725df85034f02c968b6ebd7a5e513 Part-of #4171 --- src/lj_jit.h | 10 +++++----- src/lj_opt_loop.c | 8 ++++---- src/lj_snap.c | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/lj_jit.h b/src/lj_jit.h index 92054e3..7eb3d2a 100644 --- a/src/lj_jit.h +++ b/src/lj_jit.h @@ -160,7 +160,7 @@ typedef uint32_t MCode; /* Stack snapshot header. */ typedef struct SnapShot { - uint16_t mapofs; /* Offset into snapshot map. */ + uint32_t mapofs; /* Offset into snapshot map. */ IRRef1 ref; /* First IR ref for this snapshot. */ uint8_t nslots; /* Number of valid slots. */ uint8_t topslot; /* Maximum frame extent. */ @@ -227,8 +227,7 @@ typedef enum { /* Trace object. */ typedef struct GCtrace { GCHeader; - uint8_t topslot; /* Top stack slot already checked to be allocated. */ - uint8_t linktype; /* Type of link. */ + uint16_t nsnap; /* Number of snapshots. */ IRRef nins; /* Next IR instruction. Biased with REF_BIAS. */ #if LJ_GC64 uint32_t unused_gc64; @@ -236,8 +235,7 @@ typedef struct GCtrace { GCRef gclist; IRIns *ir; /* IR instructions/constants. Biased with REF_BIAS. */ IRRef nk; /* Lowest IR constant. Biased with REF_BIAS. */ - uint16_t nsnap; /* Number of snapshots. */ - uint16_t nsnapmap; /* Number of snapshot map elements. */ + uint32_t nsnapmap; /* Number of snapshot map elements. */ SnapShot *snap; /* Snapshot array. */ SnapEntry *snapmap; /* Snapshot map. */ GCRef startpt; /* Starting prototype. */ @@ -254,6 +252,8 @@ typedef struct GCtrace { TraceNo1 nextroot; /* Next root trace for same prototype. */ TraceNo1 nextside; /* Next side trace of same root trace. */ uint8_t sinktags; /* Trace has SINK tags. */ + uint8_t topslot; /* Top stack slot already checked to be allocated. */ + uint8_t linktype; /* Type of link. */ uint8_t unused1; #ifdef LUAJIT_USE_GDBJIT void *gdbjit_entry; /* GDB JIT entry. */ diff --git a/src/lj_opt_loop.c b/src/lj_opt_loop.c index 04c6d06..441b8ad 100644 --- a/src/lj_opt_loop.c +++ b/src/lj_opt_loop.c @@ -223,7 +223,7 @@ static void loop_subst_snap(jit_State *J, SnapShot *osnap, } J->guardemit.irt = 0; /* Setup new snapshot. */ - snap->mapofs = (uint16_t)nmapofs; + snap->mapofs = (uint32_t)nmapofs; snap->ref = (IRRef1)J->cur.nins; snap->nslots = nslots; snap->topslot = osnap->topslot; @@ -251,7 +251,7 @@ static void loop_subst_snap(jit_State *J, SnapShot *osnap, nmap += nn; while (omap < nextmap) /* Copy PC + frame links. */ *nmap++ = *omap++; - J->cur.nsnapmap = (uint16_t)(nmap - J->cur.snapmap); + J->cur.nsnapmap = (uint32_t)(nmap - J->cur.snapmap); } typedef struct LoopState { @@ -369,7 +369,7 @@ static void loop_unroll(LoopState *lps) } } if (!irt_isguard(J->guardemit)) /* Drop redundant snapshot. */ - J->cur.nsnapmap = (uint16_t)J->cur.snap[--J->cur.nsnap].mapofs; + J->cur.nsnapmap = (uint32_t)J->cur.snap[--J->cur.nsnap].mapofs; lua_assert(J->cur.nsnapmap <= J->sizesnapmap); *psentinel = J->cur.snapmap[J->cur.snap[0].nent]; /* Restore PC. */ @@ -383,7 +383,7 @@ static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap, MSize nsnapmap) SnapShot *snap = &J->cur.snap[nsnap-1]; SnapEntry *map = J->cur.snapmap; map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent]; /* Restore PC. */ - J->cur.nsnapmap = (uint16_t)nsnapmap; + J->cur.nsnapmap = (uint32_t)nsnapmap; J->cur.nsnap = nsnap; J->guardemit.irt = 0; lj_ir_rollback(J, ins); diff --git a/src/lj_snap.c b/src/lj_snap.c index bb063c2..3ff8dd4 100644 --- a/src/lj_snap.c +++ b/src/lj_snap.c @@ -161,11 +161,11 @@ static void snapshot_stack(jit_State *J, SnapShot *snap, MSize nsnapmap) nent = snapshot_slots(J, p, nslots); snap->nent = (uint8_t)nent; nent += snapshot_framelinks(J, p + nent, &snap->topslot); - snap->mapofs = (uint16_t)nsnapmap; + snap->mapofs = (uint32_t)nsnapmap; snap->ref = (IRRef1)J->cur.nins; snap->nslots = (uint8_t)nslots; snap->count = 0; - J->cur.nsnapmap = (uint16_t)(nsnapmap + nent); + J->cur.nsnapmap = (uint32_t)(nsnapmap + nent + 1 + J->framedepth); } /* Add or merge a snapshot. */ @@ -326,7 +326,7 @@ void lj_snap_shrink(jit_State *J) snap->nent = (uint8_t)m; nlim = J->cur.nsnapmap - snap->mapofs - 1; while (n <= nlim) map[m++] = map[n++]; /* Move PC + frame links down. */ - J->cur.nsnapmap = (uint16_t)(snap->mapofs + m); /* Free up space in map. */ + J->cur.nsnapmap = (uint32_t)(snap->mapofs + m); /* Free up space in map. */ } /* -- Snapshot access ----------------------------------------------------- */ -- 2.20.1
next prev parent reply other threads:[~2019-05-18 12:35 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-05-18 12:33 [tarantool-patches] [PATCH 0/3] luajit: Fixes in sake of #4171 Cyrill Gorcunov 2019-05-18 12:33 ` Cyrill Gorcunov [this message] 2019-05-18 12:33 ` [tarantool-patches] [PATCH 2/3] Fix rechaining of pseudo-resurrected string keys Cyrill Gorcunov 2019-05-18 12:38 ` [tarantool-patches] [PATCH 3/3] bugfix: LuaJIT tables' hash chains might get corrupted leading to infinite loops while fetching, missing keys, and etc Cyrill Gorcunov 2019-05-19 18:13 ` [tarantool-patches] Re: [PATCH 0/3] luajit: Fixes in sake of #4171 Alexander Turenko 2019-05-19 18:23 ` Cyrill Gorcunov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190518123356.15780-2-gorcunov@gmail.com \ --to=gorcunov@gmail.com \ --cc=alexander.turenko@tarantool.org \ --cc=kyukhin@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='Re: [tarantool-patches] [PATCH 1/3] Fix overflow of snapshot map offset.' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox