]> www.infradead.org Git - users/hch/misc.git/commitdiff
vxlan: Handle error of rtnl_register_module().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Tue, 8 Oct 2024 18:47:33 +0000 (11:47 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 10 Oct 2024 13:39:35 +0000 (15:39 +0200)
Since introduced, vxlan_vnifilter_init() has been ignoring the
returned value of rtnl_register_module(), which could fail silently.

Handling the error allows users to view a module as an all-or-nothing
thing in terms of the rtnetlink functionality.  This prevents syzkaller
from reporting spurious errors from its tests, where OOM often occurs
and module is automatically loaded.

Let's handle the errors by rtnl_register_many().

Fixes: f9c4bb0b245c ("vxlan: vni filtering support on collect metadata device")
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/vxlan/vxlan_core.c
drivers/net/vxlan/vxlan_private.h
drivers/net/vxlan/vxlan_vnifilter.c

index 53dcb9fffc04fe8109a032c53dff95674f6dc635..6e9a3795846aa3080b6815c2c5b36787226ee336 100644 (file)
@@ -4913,9 +4913,13 @@ static int __init vxlan_init_module(void)
        if (rc)
                goto out4;
 
-       vxlan_vnifilter_init();
+       rc = vxlan_vnifilter_init();
+       if (rc)
+               goto out5;
 
        return 0;
+out5:
+       rtnl_link_unregister(&vxlan_link_ops);
 out4:
        unregister_switchdev_notifier(&vxlan_switchdev_notifier_block);
 out3:
index b35d96b7884378db714aba64d444e42eb875d25a..76a351a997d510f18de802dbf6fe8968485dbd25 100644 (file)
@@ -202,7 +202,7 @@ int vxlan_vni_in_use(struct net *src_net, struct vxlan_dev *vxlan,
 int vxlan_vnigroup_init(struct vxlan_dev *vxlan);
 void vxlan_vnigroup_uninit(struct vxlan_dev *vxlan);
 
-void vxlan_vnifilter_init(void);
+int vxlan_vnifilter_init(void);
 void vxlan_vnifilter_uninit(void);
 void vxlan_vnifilter_count(struct vxlan_dev *vxlan, __be32 vni,
                           struct vxlan_vni_node *vninode,
index 9c59d0bf8c3de09ba87ecdeac93ea7b615a62a31..d2023e7131bd4f76a9a3ae521fdbbc04e1739525 100644 (file)
@@ -992,19 +992,18 @@ static int vxlan_vnifilter_process(struct sk_buff *skb, struct nlmsghdr *nlh,
        return err;
 }
 
-void vxlan_vnifilter_init(void)
+static const struct rtnl_msg_handler vxlan_vnifilter_rtnl_msg_handlers[] = {
+       {THIS_MODULE, PF_BRIDGE, RTM_GETTUNNEL, NULL, vxlan_vnifilter_dump, 0},
+       {THIS_MODULE, PF_BRIDGE, RTM_NEWTUNNEL, vxlan_vnifilter_process, NULL, 0},
+       {THIS_MODULE, PF_BRIDGE, RTM_DELTUNNEL, vxlan_vnifilter_process, NULL, 0},
+};
+
+int vxlan_vnifilter_init(void)
 {
-       rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_GETTUNNEL, NULL,
-                            vxlan_vnifilter_dump, 0);
-       rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_NEWTUNNEL,
-                            vxlan_vnifilter_process, NULL, 0);
-       rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_DELTUNNEL,
-                            vxlan_vnifilter_process, NULL, 0);
+       return rtnl_register_many(vxlan_vnifilter_rtnl_msg_handlers);
 }
 
 void vxlan_vnifilter_uninit(void)
 {
-       rtnl_unregister(PF_BRIDGE, RTM_GETTUNNEL);
-       rtnl_unregister(PF_BRIDGE, RTM_NEWTUNNEL);
-       rtnl_unregister(PF_BRIDGE, RTM_DELTUNNEL);
+       rtnl_unregister_many(vxlan_vnifilter_rtnl_msg_handlers);
 }