|
@@ -3828,13 +3828,14 @@ void skb_complete_tx_timestamp(struct sk_buff *skb,
|
|
|
if (!skb_may_tx_timestamp(sk, false))
|
|
|
return;
|
|
|
|
|
|
- /* take a reference to prevent skb_orphan() from freeing the socket */
|
|
|
- sock_hold(sk);
|
|
|
-
|
|
|
- *skb_hwtstamps(skb) = *hwtstamps;
|
|
|
- __skb_complete_tx_timestamp(skb, sk, SCM_TSTAMP_SND);
|
|
|
-
|
|
|
- sock_put(sk);
|
|
|
+ /* Take a reference to prevent skb_orphan() from freeing the socket,
|
|
|
+ * but only if the socket refcount is not zero.
|
|
|
+ */
|
|
|
+ if (likely(atomic_inc_not_zero(&sk->sk_refcnt))) {
|
|
|
+ *skb_hwtstamps(skb) = *hwtstamps;
|
|
|
+ __skb_complete_tx_timestamp(skb, sk, SCM_TSTAMP_SND);
|
|
|
+ sock_put(sk);
|
|
|
+ }
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp);
|
|
|
|