diff options
| -rw-r--r-- | net/ipv4/tcp_input.c | 12 | ||||
| -rw-r--r-- | net/ipv4/tcp_timer.c | 4 | 
2 files changed, 12 insertions, 4 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 036f8573814..1db66398358 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -5964,7 +5964,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,  	req = tp->fastopen_rsk;  	if (req != NULL) { -		BUG_ON(sk->sk_state != TCP_SYN_RECV && +		WARN_ON_ONCE(sk->sk_state != TCP_SYN_RECV &&  		    sk->sk_state != TCP_FIN_WAIT1);  		if (tcp_check_req(sk, skb, req, NULL, true) == NULL) @@ -6053,7 +6053,15 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,  			 * ACK we have received, this would have acknowledged  			 * our SYNACK so stop the SYNACK timer.  			 */ -			if (acceptable && req != NULL) { +			if (req != NULL) { +				/* Return RST if ack_seq is invalid. +				 * Note that RFC793 only says to generate a +				 * DUPACK for it but for TCP Fast Open it seems +				 * better to treat this case like TCP_SYN_RECV +				 * above. +				 */ +				if (!acceptable) +					return 1;  				/* We no longer need the request sock. */  				reqsk_fastopen_remove(sk, req, false);  				tcp_rearm_rto(sk); diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index fc04711e80c..d47c1b4421a 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c @@ -347,8 +347,8 @@ void tcp_retransmit_timer(struct sock *sk)  		return;  	}  	if (tp->fastopen_rsk) { -		BUG_ON(sk->sk_state != TCP_SYN_RECV && -		    sk->sk_state != TCP_FIN_WAIT1); +		WARN_ON_ONCE(sk->sk_state != TCP_SYN_RECV && +			     sk->sk_state != TCP_FIN_WAIT1);  		tcp_fastopen_synack_timer(sk);  		/* Before we receive ACK to our SYN-ACK don't retransmit  		 * anything else (e.g., data or FIN segments).  |