Index: net/quic/quic_sent_packet_manager.cc |
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc |
index bcdbc51c00d5b3722322cf886ea1daae5945ece0..0c63614055b5b5219e85dbec0bf2ab8372b730b0 100644 |
--- a/net/quic/quic_sent_packet_manager.cc |
+++ b/net/quic/quic_sent_packet_manager.cc |
@@ -252,6 +252,26 @@ void QuicSentPacketManager::HandleAckForSentPackets( |
ack_notifier_manager_.OnPacketAcked(sequence_number); |
} |
+ // Discard any retransmittable frames associated with revived packets. |
+ for (SequenceNumberSet::const_iterator revived_it = |
+ received_info.revived_packets.begin(); |
+ revived_it != received_info.revived_packets.end(); ++revived_it) { |
+ TransmissionInfo* transmission_info = |
+ FindOrNull(unacked_packets_, *revived_it); |
+ if (transmission_info == NULL) { |
+ continue; |
+ } |
+ // The retransmittable frames are removed from the most recent transmission. |
+ transmission_info = |
+ FindOrNull(unacked_packets_, |
+ *transmission_info->all_transmissions->rbegin()); |
+ if (transmission_info->retransmittable_frames == NULL) { |
+ continue; |
+ } |
+ delete transmission_info->retransmittable_frames; |
+ transmission_info->retransmittable_frames = NULL; |
+ } |
+ |
// If we have received a truncated ack, then we need to |
// clear out some previous transmissions to allow the peer |
// to actually ACK new packets. |