Fix memory access check for fast string interning.

This commit is contained in:
Mike Pall 2013-02-21 16:22:26 +01:00
parent e7633dba1e
commit d4bc6ab756

View File

@ -48,7 +48,7 @@ static LJ_AINLINE int str_fastcmp(const char *a, const char *b, MSize len)
{ {
MSize i = 0; MSize i = 0;
lua_assert(len > 0); lua_assert(len > 0);
lua_assert((((uintptr_t)a + len) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4); lua_assert((((uintptr_t)a+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4);
do { /* Note: innocuous access up to end of string + 3. */ do { /* Note: innocuous access up to end of string + 3. */
uint32_t v = lj_getu32(a+i) ^ *(const uint32_t *)(b+i); uint32_t v = lj_getu32(a+i) ^ *(const uint32_t *)(b+i);
if (v) { if (v) {
@ -121,7 +121,7 @@ GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx)
h ^= b; h -= lj_rol(b, 16); h ^= b; h -= lj_rol(b, 16);
/* Check if the string has already been interned. */ /* Check if the string has already been interned. */
o = gcref(g->strhash[h & g->strmask]); o = gcref(g->strhash[h & g->strmask]);
if (LJ_LIKELY((((uintptr_t)str + len) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4)) { if (LJ_LIKELY((((uintptr_t)str+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4)) {
while (o != NULL) { while (o != NULL) {
GCstr *sx = gco2str(o); GCstr *sx = gco2str(o);
if (sx->len == len && str_fastcmp(str, strdata(sx), len) == 0) { if (sx->len == len && str_fastcmp(str, strdata(sx), len) == 0) {