dccp: use READ_ONCE() to read sk->sk_bound_dev_if
authorEric Dumazet <edumazet@google.com>
Fri, 13 May 2022 18:55:45 +0000 (11:55 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 May 2022 09:31:06 +0000 (10:31 +0100)
When reading listener sk->sk_bound_dev_if locklessly,
we must use READ_ONCE().

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/dccp/ipv4.c
net/dccp/ipv6.c

index 82696ab..3074248 100644 (file)
@@ -628,7 +628,7 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
        sk_daddr_set(req_to_sk(req), ip_hdr(skb)->saddr);
        ireq->ir_mark = inet_request_mark(sk, skb);
        ireq->ireq_family = AF_INET;
-       ireq->ir_iif = sk->sk_bound_dev_if;
+       ireq->ir_iif = READ_ONCE(sk->sk_bound_dev_if);
 
        /*
         * Step 3: Process LISTEN state
index 4d95b64..d717ef0 100644 (file)
@@ -374,10 +374,10 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
                refcount_inc(&skb->users);
                ireq->pktopts = skb;
        }
-       ireq->ir_iif = sk->sk_bound_dev_if;
+       ireq->ir_iif = READ_ONCE(sk->sk_bound_dev_if);
 
        /* So that link locals have meaning */
-       if (!sk->sk_bound_dev_if &&
+       if (!ireq->ir_iif &&
            ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL)
                ireq->ir_iif = inet6_iif(skb);