Skip to content

Commit 9a2576f

Browse files
committed
Fix masking things
1 parent 953d9ad commit 9a2576f

2 files changed

Lines changed: 24 additions & 10 deletions

File tree

websocket_parser.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
5959
size_t r = 0;
6060
char c;
6161

62-
while(i < len) {
62+
while(EXPECTED(i < len)) {
6363
c = data[i];
6464
switch(parser->state) {
6565
case s_start:
6666
parser->length = 0;
6767
parser->flags = (uint32_t) (c & WS_OP_MASK);
6868
c >>= 7;
69-
if(c & 1) {
69+
if(EXPECTED(c & 1)) {
7070
parser->flags |= WS_FIN;
7171
}
7272
parser->state = s_head;
@@ -101,7 +101,7 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
101101
if(EXPECTED(parser->flags & WS_HAS_MASK)) {
102102
parser->state = s_mask;
103103
parser->require = 4;
104-
} else if(parser->length) {
104+
} else if(EXPECTED(parser->length)) {
105105
parser->require = parser->length;
106106
NOTIFY_CB(frame_header);
107107
parser->state = s_body;
@@ -141,7 +141,7 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
141141
}
142142
break;
143143
case s_body:
144-
if(parser->require) {
144+
if(EXPECTED(parser->require)) {
145145
r = parser->require;
146146
parser->require -= len - i;
147147
EMIT_DATA_CB(frame_body, &data[i], len - i);
@@ -163,11 +163,20 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
163163
return i;
164164
}
165165

166-
void websocket_parser_copy_masked(char * dst, const char * src, size_t len, websocket_parser * parser) {
166+
void websocket_parser_decode(char * dst, const char * src, size_t len, websocket_parser * parser) {
167167
size_t i = 0;
168168
for(; i < len; i++) {
169169
dst[i] = src[i] ^ parser->mask[(i + parser->mask_offset) % 4];
170170
}
171171

172172
parser->mask_offset = (uint8_t) ((i + parser->mask_offset + 1) % 4);
173+
}
174+
175+
uint8_t websocket_decode(char * dst, const char * src, size_t len, char mask[4], uint8_t mask_offset) {
176+
size_t i = 0;
177+
for(; i < len; i++) {
178+
dst[i] = src[i] ^ mask[(i + mask_offset) % 4];
179+
}
180+
181+
return (uint8_t) ((i + mask_offset + 1) % 4);
173182
}

websocket_parser.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,16 @@ struct websocket_parser_settings {
7474

7575
void websocket_parser_init(websocket_parser *parser);
7676
void websocket_parser_settings_init(websocket_parser_settings *settings);
77-
size_t websocket_parser_execute(websocket_parser *parser,
78-
const websocket_parser_settings *settings,
79-
const char *data,
80-
size_t len);
81-
void websocket_parser_copy_masked(char * dst, const char * src, size_t len, websocket_parser * parser);
77+
size_t websocket_parser_execute(
78+
websocket_parser *parser,
79+
const websocket_parser_settings *settings,
80+
const char *data,
81+
size_t len
82+
);
83+
void websocket_parser_decode(char * dst, const char * src, size_t len, websocket_parser * parser);
84+
uint8_t websocket_decode(char * dst, const char * src, size_t len, char mask[4], uint8_t mask_offset);
85+
#define websocket_encode(dst, src, len, mask, mask_offset) websocket_decode(dst, src, len, mask, mask_offset)
86+
8287
#ifdef __cplusplus
8388
}
8489
#endif

0 commit comments

Comments
 (0)