if (tcptw->tw_ts_recent_stamp &&
            (!twp || (reuse && time_after32(ktime_get_seconds(),
                                            tcptw->tw_ts_recent_stamp)))) {
+               /* inet_twsk_hashdance() sets sk_refcnt after putting twsk
+                * and releasing the bucket lock.
+                */
+               if (unlikely(!refcount_inc_not_zero(&sktw->sk_refcnt)))
+                       return 0;
+
                /* In case of repair and re-using TIME-WAIT sockets we still
                 * want to be sure that it is safe as above but honor the
                 * sequence numbers and time stamps set as part of the repair
                        tp->rx_opt.ts_recent       = tcptw->tw_ts_recent;
                        tp->rx_opt.ts_recent_stamp = tcptw->tw_ts_recent_stamp;
                }
-               sock_hold(sktw);
+
                return 1;
        }