]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ipv6: exthdrs: annotate data-race over multiple sysctl
authorEric Dumazet <edumazet@google.com>
Thu, 15 Jan 2026 09:41:40 +0000 (09:41 +0000)
committerJakub Kicinski <kuba@kernel.org>
Mon, 19 Jan 2026 17:56:43 +0000 (09:56 -0800)
Following four sysctls can change under us, add missing READ_ONCE().

- ipv6.sysctl.max_dst_opts_len
- ipv6.sysctl.max_dst_opts_cnt
- ipv6.sysctl.max_hbh_opts_len
- ipv6.sysctl.max_hbh_opts_cnt

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260115094141.3124990-8-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/exthdrs.c

index a23eb8734e151dac46a2d03d15de10ce6e45af54..54088fa0c09d068d35779e3cafd721cd24e00ea8 100644 (file)
@@ -314,7 +314,7 @@ fail_and_free:
        }
 
        extlen = (skb_transport_header(skb)[1] + 1) << 3;
-       if (extlen > net->ipv6.sysctl.max_dst_opts_len)
+       if (extlen > READ_ONCE(net->ipv6.sysctl.max_dst_opts_len))
                goto fail_and_free;
 
        opt->lastopt = opt->dst1 = skb_network_header_len(skb);
@@ -322,7 +322,8 @@ fail_and_free:
        dstbuf = opt->dst1;
 #endif
 
-       if (ip6_parse_tlv(false, skb, net->ipv6.sysctl.max_dst_opts_cnt)) {
+       if (ip6_parse_tlv(false, skb,
+                         READ_ONCE(net->ipv6.sysctl.max_dst_opts_cnt))) {
                skb->transport_header += extlen;
                opt = IP6CB(skb);
 #if IS_ENABLED(CONFIG_IPV6_MIP6)
@@ -1049,11 +1050,12 @@ fail_and_free:
        }
 
        extlen = (skb_transport_header(skb)[1] + 1) << 3;
-       if (extlen > net->ipv6.sysctl.max_hbh_opts_len)
+       if (extlen > READ_ONCE(net->ipv6.sysctl.max_hbh_opts_len))
                goto fail_and_free;
 
        opt->flags |= IP6SKB_HOPBYHOP;
-       if (ip6_parse_tlv(true, skb, net->ipv6.sysctl.max_hbh_opts_cnt)) {
+       if (ip6_parse_tlv(true, skb,
+                         READ_ONCE(net->ipv6.sysctl.max_hbh_opts_cnt))) {
                skb->transport_header += extlen;
                opt = IP6CB(skb);
                opt->nhoff = sizeof(struct ipv6hdr);