Close connections when reserved bits are used (autobahn test: 3 Reserved Bits)
This commit is contained in:
@ -472,12 +472,22 @@ namespace ix
|
||||
const uint8_t * data = (uint8_t *) &_rxbuf[0]; // peek, but don't consume
|
||||
ws.fin = (data[0] & 0x80) == 0x80;
|
||||
ws.rsv1 = (data[0] & 0x40) == 0x40;
|
||||
ws.rsv2 = (data[0] & 0x20) == 0x20;
|
||||
ws.rsv3 = (data[0] & 0x10) == 0x10;
|
||||
ws.opcode = (wsheader_type::opcode_type) (data[0] & 0x0f);
|
||||
ws.mask = (data[1] & 0x80) == 0x80;
|
||||
ws.N0 = (data[1] & 0x7f);
|
||||
ws.header_size = 2 + (ws.N0 == 126? 2 : 0) + (ws.N0 == 127? 8 : 0) + (ws.mask? 4 : 0);
|
||||
if (_rxbuf.size() < ws.header_size) break; /* Need: ws.header_size - _rxbuf.size() */
|
||||
|
||||
if ((ws.rsv1 && !_enablePerMessageDeflate) || ws.rsv2 || ws.rsv3)
|
||||
{
|
||||
close(WebSocketCloseConstants::kProtocolErrorCode,
|
||||
WebSocketCloseConstants::kProtocolErrorReservedBitUsed,
|
||||
_rxbuf.size());
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate payload length:
|
||||
// 0-125 mean the payload is that long.
|
||||
|
Reference in New Issue
Block a user