&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;
        }
                }
 
                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;
        }
 
 discard:
        tcp_drop(sk, skb);
        return false;
+
+reset:
+       tcp_reset(sk, skb);
+       __kfree_skb(skb);
+       return false;
 }
 
 /*