]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: Initialise net->passive once in preinit_net().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 31 Jul 2024 20:07:18 +0000 (13:07 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 3 Aug 2024 21:38:44 +0000 (22:38 +0100)
When initialising the root netns, we set net->passive in setup_net().

However, we do it twice for non-root netns in copy_net_ns() and
setup_net().

This is because we could bypass setup_net() in copy_net_ns() if
down_read_killable() fails.

preinit_net() is a better place to put such an operation.

Let's initialise net->passive in preinit_net().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/net_namespace.c

index 1cd87df13f39ca85ed8e0825aba0027e3133e4df..6c9acb0868529e67d7381967b0359213a8ba63b9 100644 (file)
@@ -312,6 +312,7 @@ EXPORT_SYMBOL_GPL(get_net_ns_by_id);
 /* init code that must occur even if setup_net() is not called. */
 static __net_init void preinit_net(struct net *net)
 {
+       refcount_set(&net->passive, 1);
        ref_tracker_dir_init(&net->notrefcnt_tracker, 128, "net notrefcnt");
 }
 
@@ -329,7 +330,6 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
        refcount_set(&net->ns.count, 1);
        ref_tracker_dir_init(&net->refcnt_tracker, 128, "net refcnt");
 
-       refcount_set(&net->passive, 1);
        get_random_bytes(&net->hash_mix, sizeof(u32));
        preempt_disable();
        net->net_cookie = gen_cookie_next(&net_cookie);
@@ -498,7 +498,6 @@ struct net *copy_net_ns(unsigned long flags,
        }
 
        preinit_net(net);
-       refcount_set(&net->passive, 1);
        net->ucounts = ucounts;
        get_user_ns(user_ns);