Skip to content

Commit 65a0932

Browse files
committedJan 17, 2017
Reject, not accept, TCP RST packets in LISTEN state.
These packets may have been destined for a different socket.
1 parent 4952f55 commit 65a0932

File tree

2 files changed

+21
-20
lines changed

2 files changed

+21
-20
lines changed
 

Diff for: ‎src/iface/ethernet.rs

+19-18
Original file line numberDiff line numberDiff line change
@@ -228,24 +228,25 @@ impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
228228

229229
if !handled && protocol == IpProtocol::Tcp {
230230
let tcp_packet = try!(TcpPacket::new(ipv4_packet.payload()));
231-
232-
let tcp_reply_repr = TcpRepr {
233-
src_port: tcp_packet.dst_port(),
234-
dst_port: tcp_packet.src_port(),
235-
control: TcpControl::Rst,
236-
seq_number: tcp_packet.ack_number(),
237-
ack_number: Some(tcp_packet.seq_number() +
238-
tcp_packet.segment_len()),
239-
window_len: 0,
240-
payload: &[]
241-
};
242-
let ipv4_reply_repr = Ipv4Repr {
243-
src_addr: dst_addr,
244-
dst_addr: src_addr,
245-
protocol: IpProtocol::Tcp,
246-
payload_len: tcp_reply_repr.buffer_len()
247-
};
248-
response = Response::Tcpv4(ipv4_reply_repr, tcp_reply_repr);
231+
if !tcp_packet.rst() {
232+
let tcp_reply_repr = TcpRepr {
233+
src_port: tcp_packet.dst_port(),
234+
dst_port: tcp_packet.src_port(),
235+
control: TcpControl::Rst,
236+
seq_number: tcp_packet.ack_number(),
237+
ack_number: Some(tcp_packet.seq_number() +
238+
tcp_packet.segment_len()),
239+
window_len: 0,
240+
payload: &[]
241+
};
242+
let ipv4_reply_repr = Ipv4Repr {
243+
src_addr: dst_addr,
244+
dst_addr: src_addr,
245+
protocol: IpProtocol::Tcp,
246+
payload_len: tcp_reply_repr.buffer_len()
247+
};
248+
response = Response::Tcpv4(ipv4_reply_repr, tcp_reply_repr);
249+
}
249250
} else if !handled {
250251
let reason;
251252
if protocol == IpProtocol::Udp {

Diff for: ‎src/socket/tcp.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ impl<'a> TcpSocket<'a> {
657657
match (self.state, repr) {
658658
// RSTs are ignored in the LISTEN state.
659659
(State::Listen, TcpRepr { control: TcpControl::Rst, .. }) =>
660-
return Ok(()),
660+
return Err(Error::Rejected),
661661

662662
// RSTs in SYN-RECEIVED flip the socket back to the LISTEN state.
663663
(State::SynReceived, TcpRepr { control: TcpControl::Rst, .. }) => {
@@ -1224,7 +1224,7 @@ mod test {
12241224
seq_number: REMOTE_SEQ,
12251225
ack_number: None,
12261226
..SEND_TEMPL
1227-
});
1227+
}, Err(Error::Rejected));
12281228
}
12291229

12301230
#[test]

0 commit comments

Comments
 (0)
Please sign in to comment.