Skip to content

Commit 3f5ae99

Browse files
authored
Fix unaligned load/store exception in luaR_findentry (#2702)
1 parent a90de79 commit 3f5ae99

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

app/lua/lrotable.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ const TValue* luaR_findentry(ROTable *rotable, TString *key, unsigned *ppos) {
8686
size_t hash = HASH(rotable, key);
8787
unsigned i = 0;
8888
int j = lookup_cache(hash, rotable);
89+
unsigned l = key ? key->tsv.len : sizeof("__metatable")-1;
8990

9091
if (pentry) {
9192
if (j >= 0){
@@ -101,9 +102,9 @@ const TValue* luaR_findentry(ROTable *rotable, TString *key, unsigned *ppos) {
101102
* aren't needed if there is a cache hit. Note that the termination null
102103
* is included so a "on\0" has a mask of 0xFFFFFF and "a\0" has 0xFFFF.
103104
*/
104-
unsigned name4 = *(unsigned *)strkey;
105-
unsigned l = key ? key->tsv.len : sizeof("__metatable")-1;
106-
unsigned mask4 = l > 2 ? (~0u) : (~0u)>>((3-l)*8);
105+
unsigned name4, mask4 = l > 2 ? (~0u) : (~0u)>>((3-l)*8);
106+
c_memcpy(&name4, strkey, sizeof(name4));
107+
107108
for(;pentry->key.type != LUA_TNIL; i++, pentry++) {
108109
if ((pentry->key.type == LUA_TSTRING) &&
109110
((*(unsigned *)pentry->key.id.strkey ^ name4) & mask4) == 0 &&

0 commit comments

Comments
 (0)