Fix ACK validation of TCP RST packets.

v0.7.x
whitequark 2016-12-27 20:17:35 +00:00
parent 867dda659d
commit 71d1b4061f
2 changed files with 23 additions and 5 deletions

View File

@ -67,11 +67,6 @@ fn main() {
let mut tcp_6969_connected = false;
loop {
match iface.poll() {
Ok(()) => (),
Err(e) => debug!("poll error: {}", e)
}
{
let socket: &mut UdpSocket = iface.sockets()[0].as_socket();
let client = match socket.recv() {
@ -98,6 +93,10 @@ fn main() {
{
let socket: &mut TcpSocket = iface.sockets()[1].as_socket();
if !socket.is_open() {
socket.listen(endpoint).unwrap()
}
if socket.is_connected() && !tcp_6969_connected {
debug!("tcp connected");
} else if !socket.is_connected() && tcp_6969_connected {
@ -124,5 +123,10 @@ fn main() {
}
}
}
match iface.poll() {
Ok(()) => (),
Err(e) => debug!("poll error: {}", e)
}
}
}

View File

@ -458,6 +458,8 @@ impl<'a> TcpSocket<'a> {
return Err(Error::Malformed)
}
}
// Any other RST need only have a valid sequence number.
(_, TcpRepr { control: TcpControl::Rst, .. }) => (),
// Every packet after the initial SYN must be an acknowledgement.
(_, TcpRepr { ack_number: None, .. }) => {
net_trace!("tcp:{}:{}: expecting an ACK",
@ -1134,6 +1136,18 @@ mod test {
assert_eq!(s.state, State::Closed);
}
#[test]
fn test_established_rst_no_ack() {
let mut s = socket_established();
send!(s, [TcpRepr {
control: TcpControl::Rst,
seq_number: REMOTE_SEQ + 1,
ack_number: None,
..SEND_TEMPL
}]);
assert_eq!(s.state, State::Closed);
}
// =========================================================================================//
// Tests for the CLOSE_WAIT state.
// =========================================================================================//