tcp: consume incoming skb leading to a reset
authorEric Dumazet <edumazet@google.com>
Sat, 16 Apr 2022 00:10:39 +0000 (17:10 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 17 Apr 2022 12:31:31 +0000 (13:31 +0100)
Whenever tcp_validate_incoming() handles a valid RST packet,
we should not pretend the packet was dropped.

Create a special section at the end of tcp_validate_incoming()
to handle this case.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_input.c

index 1595b76..d4bc717 100644 (file)
@@ -5700,7 +5700,7 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
                                                  &tp->last_oow_ack_time))
                                tcp_send_dupack(sk, skb);
                } else if (tcp_reset_check(sk, skb)) {
-                       tcp_reset(sk, skb);
+                       goto reset;
                }
                goto discard;
        }
@@ -5736,17 +5736,16 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
                }
 
                if (rst_seq_match)
-                       tcp_reset(sk, skb);
-               else {
-                       /* Disable TFO if RST is out-of-order
-                        * and no data has been received
-                        * for current active TFO socket
-                        */
-                       if (tp->syn_fastopen && !tp->data_segs_in &&
-                           sk->sk_state == TCP_ESTABLISHED)
-                               tcp_fastopen_active_disable(sk);
-                       tcp_send_challenge_ack(sk);
-               }
+                       goto reset;
+
+               /* Disable TFO if RST is out-of-order
+                * and no data has been received
+                * for current active TFO socket
+                */
+               if (tp->syn_fastopen && !tp->data_segs_in &&
+                   sk->sk_state == TCP_ESTABLISHED)
+                       tcp_fastopen_active_disable(sk);
+               tcp_send_challenge_ack(sk);
                goto discard;
        }
 
@@ -5771,6 +5770,11 @@ syn_challenge:
 discard:
        tcp_drop(sk, skb);
        return false;
+
+reset:
+       tcp_reset(sk, skb);
+       __kfree_skb(skb);
+       return false;
 }
 
 /*