From 16d38a4b214e8b8a20be554be77bd20286072365 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Fri, 25 Jun 2021 12:45:51 +0200 Subject: [PATCH] Avoid conflict between 64 bit lightuserdata and ITERN key. Reported by XmiliaH. --- src/lj_udata.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lj_udata.c b/src/lj_udata.c index b2ea8031..a0edd0df 100644 --- a/src/lj_udata.c +++ b/src/lj_udata.c @@ -47,9 +47,10 @@ void *lj_lightud_intern(lua_State *L, void *p) if (segmap[seg] == up) /* Fast path. */ return (void *)(((uint64_t)seg << LJ_LIGHTUD_BITS_LO) | lightudlo(u)); segnum++; + /* Leave last segment unused to avoid clash with ITERN key. */ + if (segnum >= (1 << LJ_LIGHTUD_BITS_SEG)-1) lj_err_msg(L, LJ_ERR_BADLU); } if (!((segnum-1) & segnum) && segnum != 1) { - if (segnum >= (1 << LJ_LIGHTUD_BITS_SEG)) lj_err_msg(L, LJ_ERR_BADLU); lj_mem_reallocvec(L, segmap, segnum, segnum ? 2*segnum : 2u, uint32_t); setmref(g->gc.lightudseg, segmap); }