Skip to content

Commit ebcb478

Browse files
committed
complete_io: bail out if progress is impossible
Have a test that demonstrates another route to reaching this state: a fully & cleanly closed connection.
1 parent 20f35df commit ebcb478

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

rustls/src/conn.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,11 @@ impl<Data> ConnectionCommon<Data> {
378378
loop {
379379
let until_handshaked = self.is_handshaking();
380380

381+
if !self.wants_write() && !self.wants_read() {
382+
// We will make no further progress.
383+
return Ok((rdlen, wrlen));
384+
}
385+
381386
while self.wants_write() {
382387
wrlen += self.write_tls(io)?;
383388
}

rustls/tests/api.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4976,6 +4976,44 @@ fn test_complete_io_errors_if_close_notify_received_too_early() {
49764976
);
49774977
}
49784978

4979+
#[test]
4980+
fn test_complete_io_with_no_io_needed() {
4981+
let (mut client, mut server) = make_pair(KeyType::Rsa);
4982+
do_handshake(&mut client, &mut server);
4983+
client
4984+
.writer()
4985+
.write_all(b"hello")
4986+
.unwrap();
4987+
client.send_close_notify();
4988+
transfer(&mut client, &mut server);
4989+
server.process_new_packets().unwrap();
4990+
server
4991+
.writer()
4992+
.write_all(b"hello")
4993+
.unwrap();
4994+
server.send_close_notify();
4995+
transfer(&mut server, &mut client);
4996+
client.process_new_packets().unwrap();
4997+
4998+
// neither want any IO: both directions are closed.
4999+
assert!(!client.wants_write());
5000+
assert!(!client.wants_read());
5001+
assert!(!server.wants_write());
5002+
assert!(!server.wants_read());
5003+
assert_eq!(
5004+
client
5005+
.complete_io(&mut FakeStream(&[]))
5006+
.unwrap(),
5007+
(0, 0)
5008+
);
5009+
assert_eq!(
5010+
server
5011+
.complete_io(&mut FakeStream(&[]))
5012+
.unwrap(),
5013+
(0, 0)
5014+
);
5015+
}
5016+
49795017
struct FakeStream<'a>(&'a [u8]);
49805018

49815019
impl<'a> io::Read for FakeStream<'a> {

0 commit comments

Comments
 (0)