Переглянути джерело

Avoid conflict between 64 bit lightuserdata and ITERN key.

Reported by XmiliaH.
Mike Pall 4 роки тому
батько
коміт
16d38a4b21
1 змінених файлів з 2 додано та 1 видалено
  1. 2 1
      src/lj_udata.c

+ 2 - 1
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);
   }