]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfrm: state: fix sparse warnings in xfrm_state_init
authorSabrina Dubroca <sd@queasysnail.net>
Mon, 9 Mar 2026 10:32:35 +0000 (11:32 +0100)
committerSteffen Klassert <steffen.klassert@secunet.com>
Thu, 12 Mar 2026 06:15:11 +0000 (07:15 +0100)
Use rcu_assign_pointer, and tmp variables for freeing on the error
path without accessing net->xfrm.state_by*.

Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_state.c

index ad32085267a571d539348c2aebda028f5b72fbe3..b81303cccc5e2d9b5886b5af2bc843f20b808a4a 100644 (file)
@@ -3259,6 +3259,7 @@ EXPORT_SYMBOL(xfrm_init_state);
 
 int __net_init xfrm_state_init(struct net *net)
 {
+       struct hlist_head *ndst, *nsrc, *nspi, *nseq;
        unsigned int sz;
 
        if (net_eq(net, &init_net))
@@ -3269,18 +3270,25 @@ int __net_init xfrm_state_init(struct net *net)
 
        sz = sizeof(struct hlist_head) * 8;
 
-       net->xfrm.state_bydst = xfrm_hash_alloc(sz);
-       if (!net->xfrm.state_bydst)
+       ndst = xfrm_hash_alloc(sz);
+       if (!ndst)
                goto out_bydst;
-       net->xfrm.state_bysrc = xfrm_hash_alloc(sz);
-       if (!net->xfrm.state_bysrc)
+       rcu_assign_pointer(net->xfrm.state_bydst, ndst);
+
+       nsrc = xfrm_hash_alloc(sz);
+       if (!nsrc)
                goto out_bysrc;
-       net->xfrm.state_byspi = xfrm_hash_alloc(sz);
-       if (!net->xfrm.state_byspi)
+       rcu_assign_pointer(net->xfrm.state_bysrc, nsrc);
+
+       nspi = xfrm_hash_alloc(sz);
+       if (!nspi)
                goto out_byspi;
-       net->xfrm.state_byseq = xfrm_hash_alloc(sz);
-       if (!net->xfrm.state_byseq)
+       rcu_assign_pointer(net->xfrm.state_byspi, nspi);
+
+       nseq = xfrm_hash_alloc(sz);
+       if (!nseq)
                goto out_byseq;
+       rcu_assign_pointer(net->xfrm.state_byseq, nseq);
 
        net->xfrm.state_cache_input = alloc_percpu(struct hlist_head);
        if (!net->xfrm.state_cache_input)
@@ -3296,13 +3304,13 @@ int __net_init xfrm_state_init(struct net *net)
        return 0;
 
 out_state_cache_input:
-       xfrm_hash_free(net->xfrm.state_byseq, sz);
+       xfrm_hash_free(nseq, sz);
 out_byseq:
-       xfrm_hash_free(net->xfrm.state_byspi, sz);
+       xfrm_hash_free(nspi, sz);
 out_byspi:
-       xfrm_hash_free(net->xfrm.state_bysrc, sz);
+       xfrm_hash_free(nsrc, sz);
 out_bysrc:
-       xfrm_hash_free(net->xfrm.state_bydst, sz);
+       xfrm_hash_free(ndst, sz);
 out_bydst:
        return -ENOMEM;
 }