Skip to content

Commit 23afdc0

Browse files
committed
bugfix: lua_shared_dict: use of Lua numbers as the value in shared dict might lead to unaligned accesses which could lead to crashes on architectures sensitive to address alignment (like ARMv6). thanks Shuxin Yang for the fix and thanks Stefan Parvu and Brandon B for the report in openresty/openresty#84.
1 parent a024673 commit 23afdc0

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

src/ngx_http_lua_shdict.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ ngx_http_lua_shdict_get_helper(lua_State *L, int get_stale)
481481
(unsigned long) value.len);
482482
}
483483

484-
num = *(double *) value.data;
484+
ngx_memcpy(&num, value.data, sizeof(double));
485485

486486
lua_pushnumber(L, num);
487487
break;
@@ -1220,7 +1220,7 @@ ngx_http_lua_shdict_incr(lua_State *L)
12201220

12211221
p = sd->data + key.len;
12221222

1223-
num = *(double *) p;
1223+
ngx_memcpy(&num, p, sizeof(double));
12241224
num += value;
12251225

12261226
ngx_memcpy(p, (double *) &num, sizeof(double));
@@ -1711,7 +1711,7 @@ ngx_http_lua_ffi_shdict_get(ngx_shm_zone_t *zone, u_char *key,
17111711
}
17121712

17131713
*str_value_len = value.len;
1714-
*num_value = *(double *) value.data;
1714+
ngx_memcpy(num_value, value.data, sizeof(double));
17151715
break;
17161716

17171717
case LUA_TBOOLEAN:
@@ -1801,7 +1801,7 @@ ngx_http_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key,
18011801

18021802
p = sd->data + key_len;
18031803

1804-
num = *(double *) p;
1804+
ngx_memcpy(&num, p, sizeof(double));
18051805
num += *value;
18061806

18071807
ngx_memcpy(p, (double *) &num, sizeof(double));

0 commit comments

Comments
 (0)