| 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..87e216f75bbe1f28839258bd15c6608a7be55110 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,17 @@ 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);
|
| + 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;
|
| }
|
| }
|
|
|