Return RST to unexpected ACK in SYN-SENT state.
Before this commit, the socket got stuck in an unusable state.
This commit is contained in:
parent
f35057c19f
commit
1ae400acaa
|
@ -995,6 +995,15 @@ impl<'a> TcpSocket<'a> {
|
||||||
self.meta.handle, self.local_endpoint, self.remote_endpoint);
|
self.meta.handle, self.local_endpoint, self.remote_endpoint);
|
||||||
return Err(Error::Dropped)
|
return Err(Error::Dropped)
|
||||||
}
|
}
|
||||||
|
// Any ACK in the SYN-SENT state must have the SYN flag set.
|
||||||
|
(State::SynSent, &TcpRepr {
|
||||||
|
control: TcpControl::None, ack_number: Some(_), ..
|
||||||
|
}) => {
|
||||||
|
net_debug!("{}:{}:{}: expecting a SYN|ACK",
|
||||||
|
self.meta.handle, self.local_endpoint, self.remote_endpoint);
|
||||||
|
self.abort();
|
||||||
|
return Err(Error::Dropped)
|
||||||
|
}
|
||||||
// Every acknowledgement must be for transmitted but unacknowledged data.
|
// Every acknowledgement must be for transmitted but unacknowledged data.
|
||||||
(_, &TcpRepr { ack_number: Some(ack_number), .. }) => {
|
(_, &TcpRepr { ack_number: Some(ack_number), .. }) => {
|
||||||
let unacknowledged = self.tx_buffer.len() + control_len;
|
let unacknowledged = self.tx_buffer.len() + control_len;
|
||||||
|
@ -2490,6 +2499,17 @@ mod test {
|
||||||
assert_eq!(s.state, State::SynSent);
|
assert_eq!(s.state, State::SynSent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_syn_sent_bad_ack() {
|
||||||
|
let mut s = socket_syn_sent();
|
||||||
|
send!(s, TcpRepr {
|
||||||
|
control: TcpControl::None,
|
||||||
|
ack_number: Some(TcpSeqNumber(1)),
|
||||||
|
..SEND_TEMPL
|
||||||
|
}, Err(Error::Dropped));
|
||||||
|
assert_eq!(s.state, State::Closed);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_syn_sent_close() {
|
fn test_syn_sent_close() {
|
||||||
let mut s = socket();
|
let mut s = socket();
|
||||||
|
|
Loading…
Reference in New Issue