diff --git a/src/lib_aux.c b/src/lib_aux.c index 5f4e3e8c..419650a9 100644 --- a/src/lib_aux.c +++ b/src/lib_aux.c @@ -313,6 +313,10 @@ LUALIB_API int luaL_loadstring(lua_State *L, const char *s) #ifdef LUAJIT_USE_SYSMALLOC +#if LJ_64 +#error "Must use builtin allocator for 64 bit target" +#endif + static void *mem_alloc(void *ud, void *ptr, size_t osize, size_t nsize) { (void)ud; diff --git a/src/lj_def.h b/src/lj_def.h index 8128aa21..872a7830 100644 --- a/src/lj_def.h +++ b/src/lj_def.h @@ -89,6 +89,7 @@ typedef unsigned __int32 uintptr_t; #define checku8(x) ((x) == (int32_t)(uint8_t)(x)) #define checki16(x) ((x) == (int32_t)(int16_t)(x)) #define checku16(x) ((x) == (int32_t)(uint16_t)(x)) +#define checkptr32(x) ((uintptr_t)(x) == (uint32_t)(uintptr_t)(x)) /* Every half-decent C compiler transforms this into a rotate instruction. */ #define lj_rol(x, n) (((x)<<(n)) | ((x)>>(32-(n)))) diff --git a/src/lj_gc.c b/src/lj_gc.c index cd99f249..764d74a8 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c @@ -764,6 +764,7 @@ void *lj_mem_realloc(lua_State *L, void *p, MSize osz, MSize nsz) if (p == NULL && nsz > 0) lj_err_throw(L, LUA_ERRMEM); lua_assert((nsz == 0) == (p == NULL)); + lua_assert(checkptr32(p)); g->gc.total = (g->gc.total - osz) + nsz; return p; } @@ -775,6 +776,7 @@ void *lj_mem_newgco(lua_State *L, MSize size) GCobj *o = (GCobj *)g->allocf(g->allocd, NULL, 0, size); if (o == NULL) lj_err_throw(L, LUA_ERRMEM); + lua_assert(checkptr32(o)); g->gc.total += size; setgcrefr(o->gch.nextgc, g->gc.root); setgcref(g->gc.root, o); diff --git a/src/lj_state.c b/src/lj_state.c index e1b9021e..f7f30117 100644 --- a/src/lj_state.c +++ b/src/lj_state.c @@ -163,7 +163,7 @@ LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) GG_State *GG = cast(GG_State *, f(ud, NULL, 0, sizeof(GG_State))); lua_State *L = &GG->L; global_State *g = &GG->g; - if (GG == NULL) return NULL; + if (GG == NULL || !checkptr32(GG)) return NULL; memset(GG, 0, sizeof(GG_State)); L->gct = ~LJ_TTHREAD; L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED; /* Prevent free. */