|
@@ -1397,6 +1397,8 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
nf_reset(skb);
|
|
|
|
|
|
if (up->encap_type) {
|
|
|
+ int (*encap_rcv)(struct sock *sk, struct sk_buff *skb);
|
|
|
+
|
|
|
/*
|
|
|
* This is an encapsulation socket so pass the skb to
|
|
|
* the socket's udp_encap_rcv() hook. Otherwise, just
|
|
@@ -1409,11 +1411,11 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
*/
|
|
|
|
|
|
/* if we're overly short, let UDP handle it */
|
|
|
- if (skb->len > sizeof(struct udphdr) &&
|
|
|
- up->encap_rcv != NULL) {
|
|
|
+ encap_rcv = ACCESS_ONCE(up->encap_rcv);
|
|
|
+ if (skb->len > sizeof(struct udphdr) && encap_rcv != NULL) {
|
|
|
int ret;
|
|
|
|
|
|
- ret = (*up->encap_rcv)(sk, skb);
|
|
|
+ ret = encap_rcv(sk, skb);
|
|
|
if (ret <= 0) {
|
|
|
UDP_INC_STATS_BH(sock_net(sk),
|
|
|
UDP_MIB_INDATAGRAMS,
|