|
@@ -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);
|