Internal QUICHE change

PiperOrigin-RevId: 344255387
Change-Id: I02cd0dd29159e1f92bdfecbf69c5edc68102dae0
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index 4ddf2d8..5bebbe3 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -73,7 +73,7 @@
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_testonly_default_true, true)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_tls_use_early_select_cert, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_unified_iw_options, false)
-QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_circular_deque_for_unacked_packets, false)
+QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_circular_deque_for_unacked_packets_v2, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_encryption_level_context, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_fast_huffman_encoder, true)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_write_or_buffer_data_at_level, false)
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index fba8b67..21a9626 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -671,7 +671,17 @@
     // applications may want to use higher priority stream data for bandwidth
     // probing, and some applications want to consider RTO is an indication of
     // loss, etc.
-    unacked_packets_.RetransmitFrames(*transmission_info, transmission_type);
+    // transmission_info owning these frames may be deallocated after each
+    // retransimission. Make a copy of retransmissible frames to prevent the
+    // invalidation.
+    if (unacked_packets_.use_circular_deque()) {
+      unacked_packets_.RetransmitFrames(
+          QuicFrames(transmission_info->retransmittable_frames),
+          transmission_type);
+    } else {
+      unacked_packets_.RetransmitFrames(
+          transmission_info->retransmittable_frames, transmission_type);
+    }
     return;
   }
 
diff --git a/quic/core/quic_unacked_packet_map.cc b/quic/core/quic_unacked_packet_map.cc
index 852a0df..2ad31b5 100644
--- a/quic/core/quic_unacked_packet_map.cc
+++ b/quic/core/quic_unacked_packet_map.cc
@@ -124,7 +124,7 @@
       session_notifier_(nullptr),
       supports_multiple_packet_number_spaces_(false) {
   if (use_circular_deque_) {
-    QUIC_RELOADABLE_FLAG_COUNT(quic_use_circular_deque_for_unacked_packets);
+    QUIC_RELOADABLE_FLAG_COUNT(quic_use_circular_deque_for_unacked_packets_v2);
   }
 }
 
@@ -474,9 +474,9 @@
   }
 }
 
-void QuicUnackedPacketMap::RetransmitFrames(const QuicTransmissionInfo& info,
+void QuicUnackedPacketMap::RetransmitFrames(const QuicFrames& frames,
                                             TransmissionType type) {
-  session_notifier_->RetransmitFrames(info.retransmittable_frames, type);
+  session_notifier_->RetransmitFrames(frames, type);
 }
 
 void QuicUnackedPacketMap::MaybeAggregateAckedStreamFrame(
diff --git a/quic/core/quic_unacked_packet_map.h b/quic/core/quic_unacked_packet_map.h
index 137d3f8..33b7bba 100644
--- a/quic/core/quic_unacked_packet_map.h
+++ b/quic/core/quic_unacked_packet_map.h
@@ -59,10 +59,8 @@
   void NotifyFramesLost(const QuicTransmissionInfo& info,
                         TransmissionType type);
 
-  // Notifies session_notifier to retransmit frames in |info| with
-  // |transmission_type|.
-  void RetransmitFrames(const QuicTransmissionInfo& info,
-                        TransmissionType type);
+  // Notifies session_notifier to retransmit frames with |transmission_type|.
+  void RetransmitFrames(const QuicFrames& frames, TransmissionType type);
 
   // Marks |info| as no longer in flight.
   void RemoveFromInFlight(QuicTransmissionInfo* info);
@@ -333,7 +331,7 @@
   friend class test::QuicUnackedPacketMapPeer;
 
   // TODO(haoyuewang) Remove these methods when deprecate
-  // quic_use_circular_deque_for_unacked_packets flag.
+  // quic_use_circular_deque_for_unacked_packets_v2 flag.
   size_t unacked_packets_size() const {
     return use_circular_deque_ ? unacked_packets_.size()
                                : unacked_packets_deque_.size();
@@ -433,7 +431,7 @@
   std::deque<QuicTransmissionInfo> unacked_packets_deque_;
 
   const bool use_circular_deque_ =
-      GetQuicReloadableFlag(quic_use_circular_deque_for_unacked_packets);
+      GetQuicReloadableFlag(quic_use_circular_deque_for_unacked_packets_v2);
 
   // The packet at the 0th index of unacked_packets_.
   QuicPacketNumber least_unacked_;
diff --git a/quic/core/quic_unacked_packet_map_test.cc b/quic/core/quic_unacked_packet_map_test.cc
index 4b598be..f2f8b8e 100644
--- a/quic/core/quic_unacked_packet_map_test.cc
+++ b/quic/core/quic_unacked_packet_map_test.cc
@@ -658,7 +658,7 @@
 }
 
 TEST_P(QuicUnackedPacketMapTest, ReserveInitialCapacityTest) {
-  SetQuicReloadableFlag(quic_use_circular_deque_for_unacked_packets, true);
+  SetQuicReloadableFlag(quic_use_circular_deque_for_unacked_packets_v2, true);
   QuicUnackedPacketMap unacked_packets(GetParam());
   ASSERT_EQ(QuicUnackedPacketMapPeer::GetCapacity(unacked_packets), 0u);
   unacked_packets.ReserveInitialCapacity(16);