Skip to content

Commit 059ad9e

Browse files
cyrilloskyukhin
authored andcommitted
Fix overflow of snapshot map offset.
Backport of openresty/luajit2 commit 380e440 Part-of #4171
1 parent d92380f commit 059ad9e

File tree

3 files changed

+12
-12
lines changed

3 files changed

+12
-12
lines changed

src/lj_jit.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ typedef uint32_t MCode;
160160

161161
/* Stack snapshot header. */
162162
typedef struct SnapShot {
163-
uint16_t mapofs; /* Offset into snapshot map. */
163+
uint32_t mapofs; /* Offset into snapshot map. */
164164
IRRef1 ref; /* First IR ref for this snapshot. */
165165
uint8_t nslots; /* Number of valid slots. */
166166
uint8_t topslot; /* Maximum frame extent. */
@@ -227,17 +227,15 @@ typedef enum {
227227
/* Trace object. */
228228
typedef struct GCtrace {
229229
GCHeader;
230-
uint8_t topslot; /* Top stack slot already checked to be allocated. */
231-
uint8_t linktype; /* Type of link. */
230+
uint16_t nsnap; /* Number of snapshots. */
232231
IRRef nins; /* Next IR instruction. Biased with REF_BIAS. */
233232
#if LJ_GC64
234233
uint32_t unused_gc64;
235234
#endif
236235
GCRef gclist;
237236
IRIns *ir; /* IR instructions/constants. Biased with REF_BIAS. */
238237
IRRef nk; /* Lowest IR constant. Biased with REF_BIAS. */
239-
uint16_t nsnap; /* Number of snapshots. */
240-
uint16_t nsnapmap; /* Number of snapshot map elements. */
238+
uint32_t nsnapmap; /* Number of snapshot map elements. */
241239
SnapShot *snap; /* Snapshot array. */
242240
SnapEntry *snapmap; /* Snapshot map. */
243241
GCRef startpt; /* Starting prototype. */
@@ -254,6 +252,8 @@ typedef struct GCtrace {
254252
TraceNo1 nextroot; /* Next root trace for same prototype. */
255253
TraceNo1 nextside; /* Next side trace of same root trace. */
256254
uint8_t sinktags; /* Trace has SINK tags. */
255+
uint8_t topslot; /* Top stack slot already checked to be allocated. */
256+
uint8_t linktype; /* Type of link. */
257257
uint8_t unused1;
258258
#ifdef LUAJIT_USE_GDBJIT
259259
void *gdbjit_entry; /* GDB JIT entry. */

src/lj_opt_loop.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ static void loop_subst_snap(jit_State *J, SnapShot *osnap,
223223
}
224224
J->guardemit.irt = 0;
225225
/* Setup new snapshot. */
226-
snap->mapofs = (uint16_t)nmapofs;
226+
snap->mapofs = (uint32_t)nmapofs;
227227
snap->ref = (IRRef1)J->cur.nins;
228228
snap->nslots = nslots;
229229
snap->topslot = osnap->topslot;
@@ -251,7 +251,7 @@ static void loop_subst_snap(jit_State *J, SnapShot *osnap,
251251
nmap += nn;
252252
while (omap < nextmap) /* Copy PC + frame links. */
253253
*nmap++ = *omap++;
254-
J->cur.nsnapmap = (uint16_t)(nmap - J->cur.snapmap);
254+
J->cur.nsnapmap = (uint32_t)(nmap - J->cur.snapmap);
255255
}
256256

257257
typedef struct LoopState {
@@ -369,7 +369,7 @@ static void loop_unroll(LoopState *lps)
369369
}
370370
}
371371
if (!irt_isguard(J->guardemit)) /* Drop redundant snapshot. */
372-
J->cur.nsnapmap = (uint16_t)J->cur.snap[--J->cur.nsnap].mapofs;
372+
J->cur.nsnapmap = (uint32_t)J->cur.snap[--J->cur.nsnap].mapofs;
373373
lua_assert(J->cur.nsnapmap <= J->sizesnapmap);
374374
*psentinel = J->cur.snapmap[J->cur.snap[0].nent]; /* Restore PC. */
375375

@@ -383,7 +383,7 @@ static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap, MSize nsnapmap)
383383
SnapShot *snap = &J->cur.snap[nsnap-1];
384384
SnapEntry *map = J->cur.snapmap;
385385
map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent]; /* Restore PC. */
386-
J->cur.nsnapmap = (uint16_t)nsnapmap;
386+
J->cur.nsnapmap = (uint32_t)nsnapmap;
387387
J->cur.nsnap = nsnap;
388388
J->guardemit.irt = 0;
389389
lj_ir_rollback(J, ins);

src/lj_snap.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,11 @@ static void snapshot_stack(jit_State *J, SnapShot *snap, MSize nsnapmap)
161161
nent = snapshot_slots(J, p, nslots);
162162
snap->nent = (uint8_t)nent;
163163
nent += snapshot_framelinks(J, p + nent, &snap->topslot);
164-
snap->mapofs = (uint16_t)nsnapmap;
164+
snap->mapofs = (uint32_t)nsnapmap;
165165
snap->ref = (IRRef1)J->cur.nins;
166166
snap->nslots = (uint8_t)nslots;
167167
snap->count = 0;
168-
J->cur.nsnapmap = (uint16_t)(nsnapmap + nent);
168+
J->cur.nsnapmap = (uint32_t)(nsnapmap + nent);
169169
}
170170

171171
/* Add or merge a snapshot. */
@@ -326,7 +326,7 @@ void lj_snap_shrink(jit_State *J)
326326
snap->nent = (uint8_t)m;
327327
nlim = J->cur.nsnapmap - snap->mapofs - 1;
328328
while (n <= nlim) map[m++] = map[n++]; /* Move PC + frame links down. */
329-
J->cur.nsnapmap = (uint16_t)(snap->mapofs + m); /* Free up space in map. */
329+
J->cur.nsnapmap = (uint32_t)(snap->mapofs + m); /* Free up space in map. */
330330
}
331331

332332
/* -- Snapshot access ----------------------------------------------------- */

0 commit comments

Comments
 (0)