mirror of https://github.com/ctz/rustls
complete_io: bail out if progress is impossible
Have a test that demonstrates another route to reaching this
state: a fully & cleanly closed connection.
(cherry picked from commit ebcb4782f2
)
# Conflicts:
# rustls/src/conn.rs
This commit is contained in:
parent
a0a659c10d
commit
1a3e7f47d8
|
@ -486,6 +486,11 @@ impl<Data> ConnectionCommon<Data> {
|
|||
let mut rdlen = 0;
|
||||
|
||||
loop {
|
||||
if !self.wants_write() && !self.wants_read() {
|
||||
// We will make no further progress.
|
||||
return Ok((rdlen, wrlen));
|
||||
}
|
||||
|
||||
while self.wants_write() {
|
||||
wrlen += self.write_tls(io)?;
|
||||
}
|
||||
|
|
|
@ -4550,6 +4550,44 @@ fn test_complete_io_errors_if_close_notify_received_too_early() {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_complete_io_with_no_io_needed() {
|
||||
let (mut client, mut server) = make_pair(KeyType::Rsa);
|
||||
do_handshake(&mut client, &mut server);
|
||||
client
|
||||
.writer()
|
||||
.write_all(b"hello")
|
||||
.unwrap();
|
||||
client.send_close_notify();
|
||||
transfer(&mut client, &mut server);
|
||||
server.process_new_packets().unwrap();
|
||||
server
|
||||
.writer()
|
||||
.write_all(b"hello")
|
||||
.unwrap();
|
||||
server.send_close_notify();
|
||||
transfer(&mut server, &mut client);
|
||||
client.process_new_packets().unwrap();
|
||||
|
||||
// neither want any IO: both directions are closed.
|
||||
assert!(!client.wants_write());
|
||||
assert!(!client.wants_read());
|
||||
assert!(!server.wants_write());
|
||||
assert!(!server.wants_read());
|
||||
assert_eq!(
|
||||
client
|
||||
.complete_io(&mut FakeStream(&[]))
|
||||
.unwrap(),
|
||||
(0, 0)
|
||||
);
|
||||
assert_eq!(
|
||||
server
|
||||
.complete_io(&mut FakeStream(&[]))
|
||||
.unwrap(),
|
||||
(0, 0)
|
||||
);
|
||||
}
|
||||
|
||||
struct FakeStream<'a>(&'a [u8]);
|
||||
|
||||
impl<'a> io::Read for FakeStream<'a> {
|
||||
|
|
Loading…
Reference in New Issue