blob: e98c65d32e7c4b47a918cd9ddab950c97dabf71e [file] [log] [blame]
Brian Silverman68203532015-03-01 03:54:50 -05001diff --git a/src/main/c/HybiPacketDecoder.cpp b/src/main/c/HybiPacketDecoder.cpp
2index f0fdefe..c2971b2 100644
3--- a/src/main/c/HybiPacketDecoder.cpp
4+++ b/src/main/c/HybiPacketDecoder.cpp
5@@ -27,6 +27,7 @@
6 #include "internal/LogStream.h"
7
8 #include <arpa/inet.h>
9+#include <string.h>
10
11 namespace seasocks {
12
13@@ -56,18 +57,24 @@ HybiPacketDecoder::MessageState HybiPacketDecoder::decodeNextMessage(std::vector
14 auto ptr = _messageStart + 2;
15 if (payloadLength == 126) {
16 if (_buffer.size() < 4) { return NoMessage; }
17- payloadLength = htons(*reinterpret_cast<const uint16_t*>(&_buffer[ptr]));
18+ uint16_t raw_length;
19+ memcpy(&raw_length, &_buffer[ptr], sizeof(raw_length));
20+ payloadLength = htons(raw_length);
21 ptr += 2;
22 } else if (payloadLength == 127) {
23 if (_buffer.size() < 10) { return NoMessage; }
24- payloadLength = __bswap_64(*reinterpret_cast<const uint64_t*>(&_buffer[ptr]));
25+ uint64_t raw_length;
26+ memcpy(&raw_length, &_buffer[ptr], sizeof(raw_length));
27+ payloadLength = __bswap_64(raw_length);
28 ptr += 8;
29 }
30 uint32_t mask = 0;
31 if (maskBit) {
32 // MASK is set.
33 if (_buffer.size() < ptr + 4) { return NoMessage; }
34- mask = htonl(*reinterpret_cast<const uint32_t*>(&_buffer[ptr]));
35+ uint32_t raw_length;
36+ memcpy(&raw_length, &_buffer[ptr], sizeof(raw_length));
37+ mask = htonl(raw_length);
38 ptr += 4;
39 }
40 auto bytesLeftInBuffer = _buffer.size() - ptr;