X-Git-Url: https://git.kernelconcepts.de/?a=blobdiff_plain;f=net%2Fipv4%2Fudp.c;h=1b8c5ba7d5f732ea2220ada929049c5c7cfd5e83;hb=10e2eb878f3ca07ac2f05fa5ca5e6c4c9174a27a;hp=83aa604f9273c332c5a0e5399253d961ef92eb9a;hpb=2fc09962e24ace45154d0c16024f1eb15700f3e8;p=karo-tx-linux.git diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 83aa604f9273..1b8c5ba7d5f7 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1995,12 +1995,19 @@ void udp_v4_early_demux(struct sk_buff *skb) skb->sk = sk; skb->destructor = sock_efree; - dst = sk->sk_rx_dst; + dst = READ_ONCE(sk->sk_rx_dst); if (dst) dst = dst_check(dst, 0); - if (dst) - skb_dst_set_noref(skb, dst); + if (dst) { + /* DST_NOCACHE can not be used without taking a reference */ + if (dst->flags & DST_NOCACHE) { + if (likely(atomic_inc_not_zero(&dst->__refcnt))) + skb_dst_set(skb, dst); + } else { + skb_dst_set_noref(skb, dst); + } + } } int udp_rcv(struct sk_buff *skb)