mirror of
https://github.com/fluencelabs/redis
synced 2025-04-02 15:51:05 +00:00
Security: fix Lua struct package offset handling.
After the first fix to the struct package I found another similar problem, which is fixed by this patch. It could be reproduced easily by running the following script: return struct.unpack('f', "xxxxxxxxxxxxx",-3) The above will access bytes before the 'data' pointer.
This commit is contained in:
parent
5ccb6f7a79
commit
e89086e09a
8
deps/lua/src/lua_struct.c
vendored
8
deps/lua/src/lua_struct.c
vendored
@ -293,14 +293,18 @@ static int b_unpack (lua_State *L) {
|
|||||||
const char *fmt = luaL_checkstring(L, 1);
|
const char *fmt = luaL_checkstring(L, 1);
|
||||||
size_t ld;
|
size_t ld;
|
||||||
const char *data = luaL_checklstring(L, 2, &ld);
|
const char *data = luaL_checklstring(L, 2, &ld);
|
||||||
size_t pos = luaL_optinteger(L, 3, 1) - 1;
|
size_t pos = luaL_optinteger(L, 3, 1);
|
||||||
|
luaL_argcheck(L, pos > 0, 3, "offset must be 1 or greater");
|
||||||
|
pos--; /* Lua indexes are 1-based, but here we want 0-based for C
|
||||||
|
* pointer math. */
|
||||||
int n = 0; /* number of results */
|
int n = 0; /* number of results */
|
||||||
defaultoptions(&h);
|
defaultoptions(&h);
|
||||||
while (*fmt) {
|
while (*fmt) {
|
||||||
int opt = *fmt++;
|
int opt = *fmt++;
|
||||||
size_t size = optsize(L, opt, &fmt);
|
size_t size = optsize(L, opt, &fmt);
|
||||||
pos += gettoalign(pos, &h, opt, size);
|
pos += gettoalign(pos, &h, opt, size);
|
||||||
luaL_argcheck(L, pos+size <= ld, 2, "data string too short");
|
luaL_argcheck(L, size <= ld && pos <= ld - size,
|
||||||
|
2, "data string too short");
|
||||||
/* stack space for item + next position */
|
/* stack space for item + next position */
|
||||||
luaL_checkstack(L, 2, "too many results");
|
luaL_checkstack(L, 2, "too many results");
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user