Index: net/websockets/websocket_frame_parser.cc |
diff --git a/net/websockets/websocket_frame_parser.cc b/net/websockets/websocket_frame_parser.cc |
index 1acc64ce42af9825499e9c42a9e0147d8855b34c..ad422cc8181e794e39e6e6603693f22c3ffa95ec 100644 |
--- a/net/websockets/websocket_frame_parser.cc |
+++ b/net/websockets/websocket_frame_parser.cc |
@@ -12,6 +12,7 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/scoped_vector.h" |
#include "net/base/big_endian.h" |
+#include "net/base/io_buffer.h" |
#include "net/websockets/websocket_frame.h" |
namespace { |
@@ -184,14 +185,18 @@ scoped_ptr<WebSocketFrameChunk> WebSocketFrameParser::DecodeFramePayload( |
frame_chunk->header.reset(new WebSocketFrameHeader(*current_frame_header_)); |
} |
frame_chunk->final_chunk = false; |
- frame_chunk->data.assign(current, current + next_size); |
+ frame_chunk->data = new IOBuffer(next_size); |
+ frame_chunk->size = next_size; |
+ DCHECK(frame_chunk->data); |
+ char* io_data = frame_chunk->data->data(); |
+ memcpy(io_data, current, next_size); |
if (current_frame_header_->masked) { |
// Unmask the payload. |
// TODO(yutak): This could be faster by doing unmasking for each |
// machine word (instead of each byte). |
size_t key_offset = frame_offset_ % kMaskingKeyLength; |
for (uint64 i = 0; i < next_size; ++i) { |
- frame_chunk->data[i] ^= masking_key_[key_offset]; |
+ io_data[i] ^= masking_key_[key_offset]; |
key_offset = (key_offset + 1) % kMaskingKeyLength; |
} |
} |