diff --git a/CHANGES b/CHANGES index 1fdb46dd24..aa79dac9c6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) mod_lua: After a r:wsupgrade(), mod_lua was not properly + responding to a websockets PING but instead invoking the specified + script. PR57524. [Edward Lu ] + *) mod_macro: Clear macros before initialization to avoid use-after-free on startup or restart when the module is linked statically. PR 57525 [apache.org tech.futurequest.net, Yann Ylavic] diff --git a/modules/lua/lua_request.c b/modules/lua/lua_request.c index e44009c034..dded599a4c 100644 --- a/modules/lua/lua_request.c +++ b/modules/lua/lua_request.c @@ -2252,9 +2252,12 @@ static int lua_websocket_read(lua_State *L) rv = lua_websocket_readbytes(r->connection, &byte, 1); } if (rv == APR_SUCCESS) { - unsigned char fin, opcode, mask, payload; - fin = byte >> 7; - opcode = (byte << 4) >> 4; + unsigned char ubyte, fin, opcode, mask, payload; + ubyte = (unsigned char)byte; + /* fin bit is the first bit */ + fin = ubyte >> (CHAR_BIT - 1); + /* opcode is the last four bits (there's 3 reserved bits we don't care about) */ + opcode = ubyte & 0xf; /* Get the payload length and mask bit */ if (plaintext) { @@ -2264,14 +2267,18 @@ static int lua_websocket_read(lua_State *L) rv = lua_websocket_readbytes(r->connection, &byte, 1); } if (rv == APR_SUCCESS) { - mask = byte >> 7; - payload = byte - 128; + ubyte = (unsigned char)byte; + /* Mask is the first bit */ + mask = ubyte >> (CHAR_BIT - 1); + /* Payload is the last 7 bits */ + payload = ubyte & 0x7f; plen = payload; /* Extended payload? */ if (payload == 126) { len = 2; if (plaintext) { + /* XXX: apr_socket_recv does not receive len bits, only up to len bits! */ rv = apr_socket_recv(sock, (char*) &payload_short, &len); } else {