| Index: net/quic/quic_packet_creator.cc
|
| diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc
|
| index f3800449c5bcf3683b721fa334df6063e94fe469..ce354b98ad9d8f49f4cce6a484c0acc97385a1d3 100644
|
| --- a/net/quic/quic_packet_creator.cc
|
| +++ b/net/quic/quic_packet_creator.cc
|
| @@ -456,35 +456,43 @@ SerializedPacket QuicPacketCreator::SerializePacket(
|
| // TODO(rtenneti): Change the default 64 alignas value (used the default
|
| // value from CACHELINE_SIZE).
|
| ALIGNAS(64) char buffer[kMaxPacketSize];
|
| - scoped_ptr<QuicPacket> packet;
|
| // Use the packet_size_ instead of the buffer size to ensure smaller
|
| // packet sizes are properly used.
|
| scoped_ptr<char[]> large_buffer;
|
| - if (packet_size_ <= kMaxPacketSize) {
|
| - packet.reset(
|
| - framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_));
|
| + size_t length = 0;
|
| + const bool use_stack_buffer = packet_size_ <= kMaxPacketSize;
|
| + if (use_stack_buffer) {
|
| + length =
|
| + framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_);
|
| } else {
|
| large_buffer.reset(new char[packet_size_]);
|
| - packet.reset(framer_->BuildDataPacket(header, queued_frames_,
|
| - large_buffer.get(), packet_size_));
|
| + length = framer_->BuildDataPacket(header, queued_frames_,
|
| + large_buffer.get(), packet_size_);
|
| }
|
| - if (packet == nullptr) {
|
| + if (length == 0) {
|
| LOG(DFATAL) << "Failed to serialize " << queued_frames_.size()
|
| << " frames.";
|
| return NoPacket();
|
| }
|
|
|
| - OnBuiltFecProtectedPayload(header, packet->FecProtectedData());
|
| + // TODO(ianswett) Consider replacing QuicPacket with something else,
|
| + // since it's only used to provide convenience methods to FEC and encryption.
|
| + QuicPacket packet(use_stack_buffer ? buffer : large_buffer.get(), length,
|
| + /* owns_buffer */ false,
|
| + header.public_header.connection_id_length,
|
| + header.public_header.version_flag,
|
| + header.public_header.packet_number_length);
|
| + OnBuiltFecProtectedPayload(header, packet.FecProtectedData());
|
|
|
| // Because of possible truncation, we can't be confident that our
|
| // packet size calculation worked correctly.
|
| if (!possibly_truncated_by_length) {
|
| - DCHECK_EQ(packet_size_, packet->length());
|
| + DCHECK_EQ(packet_size_, length);
|
| }
|
| // Immediately encrypt the packet, to ensure we don't encrypt the same packet
|
| // packet number multiple times.
|
| QuicEncryptedPacket* encrypted =
|
| - framer_->EncryptPayload(encryption_level_, packet_number_, *packet,
|
| + framer_->EncryptPayload(encryption_level_, packet_number_, packet,
|
| encrypted_buffer, encrypted_buffer_len);
|
| if (encrypted == nullptr) {
|
| LOG(DFATAL) << "Failed to encrypt packet number " << packet_number_;
|
|
|