diff --git a/quinn-proto/src/connection.rs b/quinn-proto/src/connection.rs index ef682de7f..da4628b6d 100644 --- a/quinn-proto/src/connection.rs +++ b/quinn-proto/src/connection.rs @@ -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 diff --git a/quinn-proto/src/tests.rs b/quinn-proto/src/tests.rs index 341257aaa..323214cde 100644 --- a/quinn-proto/src/tests.rs +++ b/quinn-proto/src/tests.rs @@ -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);