Change absl::string_view to std::unique_ptr<char[]> in QuicConnection::BufferedPacket to make the ownership clear.
PiperOrigin-RevId: 443203191
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc
index 3826f8d..51dfd24 100644
--- a/quiche/quic/core/quic_connection.cc
+++ b/quiche/quic/core/quic_connection.cc
@@ -3073,11 +3073,10 @@
}
const BufferedPacket& packet = buffered_packets_.front();
WriteResult result = writer_->WritePacket(
- packet.encrypted_buffer.data(), packet.encrypted_buffer.length(),
- packet.self_address.host(), packet.peer_address, per_packet_options_);
+ packet.data.get(), packet.length, packet.self_address.host(),
+ packet.peer_address, per_packet_options_);
QUIC_DVLOG(1) << ENDPOINT << "Sending buffered packet, result: " << result;
- if (IsMsgTooBig(writer_, result) &&
- packet.encrypted_buffer.length() > long_term_mtu_) {
+ if (IsMsgTooBig(writer_, result) && packet.length > long_term_mtu_) {
// When MSG_TOO_BIG is returned, the system typically knows what the
// actual MTU is, so there is no need to probe further.
// TODO(wub): Reduce max packet size to a safe default, or the actual MTU.
@@ -4916,21 +4915,18 @@
QuicConnection::BufferedPacket::BufferedPacket(
const SerializedPacket& packet, const QuicSocketAddress& self_address,
const QuicSocketAddress& peer_address)
- : encrypted_buffer(CopyBuffer(packet), packet.encrypted_length),
- self_address(self_address),
- peer_address(peer_address) {}
+ : BufferedPacket(packet.encrypted_buffer, packet.encrypted_length,
+ self_address, peer_address) {}
QuicConnection::BufferedPacket::BufferedPacket(
- char* encrypted_buffer, QuicPacketLength encrypted_length,
+ const char* encrypted_buffer, QuicPacketLength encrypted_length,
const QuicSocketAddress& self_address,
const QuicSocketAddress& peer_address)
- : encrypted_buffer(CopyBuffer(encrypted_buffer, encrypted_length),
- encrypted_length),
+ : length(encrypted_length),
self_address(self_address),
- peer_address(peer_address) {}
-
-QuicConnection::BufferedPacket::~BufferedPacket() {
- delete[] encrypted_buffer.data();
+ peer_address(peer_address) {
+ data = std::make_unique<char[]>(encrypted_length);
+ memcpy(data.get(), encrypted_buffer, encrypted_length);
}
HasRetransmittableData QuicConnection::IsRetransmittable(
diff --git a/quiche/quic/core/quic_connection.h b/quiche/quic/core/quic_connection.h
index a52785c..5a4e655 100644
--- a/quiche/quic/core/quic_connection.h
+++ b/quiche/quic/core/quic_connection.h
@@ -1391,16 +1391,17 @@
BufferedPacket(const SerializedPacket& packet,
const QuicSocketAddress& self_address,
const QuicSocketAddress& peer_address);
- BufferedPacket(char* encrypted_buffer, QuicPacketLength encrypted_length,
+ BufferedPacket(const char* encrypted_buffer,
+ QuicPacketLength encrypted_length,
const QuicSocketAddress& self_address,
const QuicSocketAddress& peer_address);
BufferedPacket(const BufferedPacket& other) = delete;
BufferedPacket(const BufferedPacket&& other) = delete;
- ~BufferedPacket();
+ ~BufferedPacket() = default;
- // encrypted_buffer is owned by buffered packet.
- absl::string_view encrypted_buffer;
+ std::unique_ptr<char[]> data;
+ const QuicPacketLength length;
// Self and peer addresses when the packet is serialized.
const QuicSocketAddress self_address;
const QuicSocketAddress peer_address;