diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c index ddbc4d7482d2..ecba33abb6b1 100644 --- a/lib/kobject_uevent.c +++ b/lib/kobject_uevent.c @@ -411,9 +411,15 @@ static int kobject_uevent_net_broadcast(struct kobject *kobj, devpath); else { const struct net *net = container_of(ns, struct net, ns); + struct uevent_sock *ue_sk; - ret = uevent_net_broadcast_tagged(net->uevent_sock->sk, env, - action_string, devpath); + mutex_lock(&uevent_sock_mutex); + ue_sk = net->uevent_sock; + if (ue_sk && ue_sk->sk) + ret = uevent_net_broadcast_tagged(ue_sk->sk, env, + action_string, + devpath); + mutex_unlock(&uevent_sock_mutex); } #endif @@ -804,13 +810,17 @@ static int uevent_net_init(struct net *net) static void uevent_net_exit(struct net *net) { - struct uevent_sock *ue_sk = net->uevent_sock; + struct uevent_sock *ue_sk; - if (sock_net(ue_sk->sk)->user_ns == &init_user_ns) { - mutex_lock(&uevent_sock_mutex); + mutex_lock(&uevent_sock_mutex); + ue_sk = net->uevent_sock; + net->uevent_sock = NULL; + if (ue_sk && sock_net(ue_sk->sk)->user_ns == &init_user_ns) list_del(&ue_sk->list); - mutex_unlock(&uevent_sock_mutex); - } + mutex_unlock(&uevent_sock_mutex); + + if (!ue_sk) + return; netlink_kernel_release(ue_sk->sk); kfree(ue_sk);