diff --git a/websocket.c b/websocket.c index 9df358a..54deee0 100644 --- a/websocket.c +++ b/websocket.c @@ -354,12 +354,14 @@ static err_t ws_read(struct altcp_pcb *pcb, struct ws_state *wss, struct pbuf *p uint8_t masked = data[1] & 0x80; uint16_t msg_len = data[1] & 0x7F; uint8_t *msg; - + uint8_t *mask; + switch (msg_len) { case 126: // next two bytes are length - memcpy(&msg_len, &data[2], 2); + msg_len = ( (uint16_t)data[2] << 8) | data[3]; if (len >= 8) { msg = &data[8]; + mask = &data[4]; } break; case 127: // next four bytes are length @@ -369,6 +371,7 @@ static err_t ws_read(struct altcp_pcb *pcb, struct ws_state *wss, struct pbuf *p default: if (len >= 6) { msg = &data[6]; + mask = &data[2]; } break; } @@ -382,8 +385,6 @@ static err_t ws_read(struct altcp_pcb *pcb, struct ws_state *wss, struct pbuf *p if (msg && ws_receive_cb != NULL) { // unmask the data if mask bit is received if (masked) { - uint8_t *mask = &data[2]; - for (int i=0; i