Skip to content

Commit 2bd2061

Browse files
authored
fix(websocket): prevent OOB read from oversized/wrapped frame length (#852) (#864)
1 parent 5c6fb98 commit 2bd2061

2 files changed

Lines changed: 6 additions & 4 deletions

File tree

http/WebSocketParser.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ static int on_frame_header(websocket_parser* parser) {
1212
if (opcode != WS_OP_CONTINUE) {
1313
wp->opcode = opcode;
1414
}
15-
int length = parser->length;
16-
int reserve_length = MIN(length + 1, MAX_PAYLOAD_LENGTH);
17-
if (reserve_length > wp->message.capacity()) {
15+
// parser->length is size_t; use it only as a capacity hint, capped.
16+
size_t length = parser->length;
17+
size_t reserve_length = MIN(length + 1, (size_t)MAX_PAYLOAD_LENGTH);
18+
if (reserve_length > (size_t)wp->message.capacity()) {
1819
wp->message.reserve(reserve_length);
1920
}
2021
if (wp->state == WS_FRAME_BEGIN ||

http/websocket_parser.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
142142
break;
143143
case s_body:
144144
if(parser->require) {
145-
if(p + parser->require <= end) {
145+
// size_t-safe check: `p + require` can overflow/wrap for a huge require.
146+
if(parser->require <= (size_t)(end - p)) {
146147
EMIT_DATA_CB(frame_body, p, parser->require);
147148
p += parser->require;
148149
parser->require = 0;

0 commit comments

Comments
 (0)