Fix incomplete stream state reset on 0-RTT rejection

This commit is contained in:
Benjamin Saunders
2019-02-03 23:55:49 -08:00
committed by Dirkjan Ochtman
parent 47bc2886c2
commit be801edd10
2 changed files with 23 additions and 7 deletions
+13 -5
View File
@@ -2893,12 +2893,20 @@ impl Connection {
debug!(self.log, "0-RTT rejected");
self.accepted_0rtt = false;
// Reset all outgoing streams
for (id, stream) in &mut self.streams.streams {
if id.initiator() != self.side {
continue;
}
*stream.send_mut().unwrap() = stream::Send::new();
for i in 0..self.streams.next_bi {
self.streams
.streams
.remove(&StreamId::new(self.side, Directionality::Bi, i))
.unwrap();
}
self.streams.next_bi = 0;
for i in 0..self.streams.next_uni {
self.streams
.streams
.remove(&StreamId::new(self.side, Directionality::Uni, i))
.unwrap();
}
self.streams.next_uni = 0;
// Discard already-queued frames
self.space_mut(SpaceId::Data).pending = Retransmits::default();
// Discard 0-RTT packets
+10 -2
View File
@@ -687,8 +687,12 @@ fn zero_rtt_rejection() {
.unwrap();
pair.drive();
pair.server.assert_accept();
assert_matches!(pair.server.poll(), Some((_, Event::Connected)));
assert_matches!(pair.server.poll(), None);
pair.client.close(pair.time, client_conn, 0, [][..].into());
pair.drive();
assert_matches!(pair.server.poll(), Some((_, Event::ConnectionLost { .. })));
assert_matches!(pair.server.poll(), None);
// Changing protocols invalidates 0-RTT
Arc::get_mut(&mut config)
@@ -706,8 +710,12 @@ fn zero_rtt_rejection() {
pair.drive();
assert!(!pair.client.connection(client_conn).accepted_0rtt());
let server_conn = pair.server.assert_accept();
assert_matches!(
pair.server.read_unordered(server_conn, s),
assert_matches!(pair.server.poll(), Some((_, Event::Connected)));
assert_matches!(pair.server.poll(), None);
let s2 = pair.client.open(client_conn, Directionality::Uni).unwrap();
assert_eq!(s, s2);
assert_eq!(
pair.server.read_unordered(server_conn, s2),
Err(ReadError::Blocked)
);
assert_eq!(pair.client.connection(client_conn).lost_packets(), 0);