Message ID | 20220915010835.1761211-1-william.xuanziyang@huawei.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 63b7c2ebcc1d69bbf19e7418ef6c2496364f0ce2 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next] net/af_packet: registration process optimization in packet_init() | expand |
Hello: This patch was applied to netdev/net-next.git (master) by David S. Miller <davem@davemloft.net>: On Thu, 15 Sep 2022 09:08:35 +0800 you wrote: > Now, register_pernet_subsys() and register_netdevice_notifier() are both > after sock_register(). It can create PF_PACKET socket and process socket > once sock_register() successfully. It is possible PF_PACKET socket is > creating but register_pernet_subsys() and register_netdevice_notifier() > are not registered yet. Thus net->packet.sklist_lock and net->packet.sklist > will be accessed without initialization that is done in packet_net_init(). > Although this is a low probability scenario. > > [...] Here is the summary with links: - [net-next] net/af_packet: registration process optimization in packet_init() https://git.kernel.org/netdev/net-next/c/63b7c2ebcc1d You are awesome, thank you!
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 5cbe07116e04..52cc9931b367 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -4725,37 +4725,37 @@ static struct pernet_operations packet_net_ops = { static void __exit packet_exit(void) { - unregister_netdevice_notifier(&packet_netdev_notifier); - unregister_pernet_subsys(&packet_net_ops); sock_unregister(PF_PACKET); proto_unregister(&packet_proto); + unregister_netdevice_notifier(&packet_netdev_notifier); + unregister_pernet_subsys(&packet_net_ops); } static int __init packet_init(void) { int rc; - rc = proto_register(&packet_proto, 0); - if (rc) - goto out; - rc = sock_register(&packet_family_ops); - if (rc) - goto out_proto; rc = register_pernet_subsys(&packet_net_ops); if (rc) - goto out_sock; + goto out; rc = register_netdevice_notifier(&packet_netdev_notifier); if (rc) goto out_pernet; + rc = proto_register(&packet_proto, 0); + if (rc) + goto out_notifier; + rc = sock_register(&packet_family_ops); + if (rc) + goto out_proto; return 0; -out_pernet: - unregister_pernet_subsys(&packet_net_ops); -out_sock: - sock_unregister(PF_PACKET); out_proto: proto_unregister(&packet_proto); +out_notifier: + unregister_netdevice_notifier(&packet_netdev_notifier); +out_pernet: + unregister_pernet_subsys(&packet_net_ops); out: return rc; }
Now, register_pernet_subsys() and register_netdevice_notifier() are both after sock_register(). It can create PF_PACKET socket and process socket once sock_register() successfully. It is possible PF_PACKET socket is creating but register_pernet_subsys() and register_netdevice_notifier() are not registered yet. Thus net->packet.sklist_lock and net->packet.sklist will be accessed without initialization that is done in packet_net_init(). Although this is a low probability scenario. Move register_pernet_subsys() and register_netdevice_notifier() to the front in packet_init(). Correspondingly, adjust the unregister process in packet_exit(). Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com> --- net/packet/af_packet.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)