]> www.infradead.org Git - users/hch/misc.git/commitdiff
phonet: Handle error of rtnl_register_module().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Tue, 8 Oct 2024 18:47:37 +0000 (11:47 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 10 Oct 2024 13:39:36 +0000 (15:39 +0200)
Before commit addf9b90de22 ("net: rtnetlink: use rcu to free rtnl
message handlers"), once the first rtnl_register_module() allocated
rtnl_msg_handlers[PF_PHONET], the following calls never failed.

However, after the commit, rtnl_register_module() could fail silently
to allocate rtnl_msg_handlers[PF_PHONET][msgtype] and requires error
handling for each call.

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 use rtnl_register_many() to handle the errors easily.

Fixes: addf9b90de22 ("net: rtnetlink: use rcu to free rtnl message handlers")
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Acked-by: Rémi Denis-Courmont <courmisch@gmail.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/phonet/pn_netlink.c

index 7008d402499d5bb161128899b004b08d79569ec2..894e5c72d6bfff7e2b634b7f6d19d023da695e31 100644 (file)
@@ -285,23 +285,17 @@ static int route_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
        return err;
 }
 
+static const struct rtnl_msg_handler phonet_rtnl_msg_handlers[] __initdata_or_module = {
+       {THIS_MODULE, PF_PHONET, RTM_NEWADDR, addr_doit, NULL, 0},
+       {THIS_MODULE, PF_PHONET, RTM_DELADDR, addr_doit, NULL, 0},
+       {THIS_MODULE, PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit, 0},
+       {THIS_MODULE, PF_PHONET, RTM_NEWROUTE, route_doit, NULL, 0},
+       {THIS_MODULE, PF_PHONET, RTM_DELROUTE, route_doit, NULL, 0},
+       {THIS_MODULE, PF_PHONET, RTM_GETROUTE, NULL, route_dumpit,
+        RTNL_FLAG_DUMP_UNLOCKED},
+};
+
 int __init phonet_netlink_register(void)
 {
-       int err = rtnl_register_module(THIS_MODULE, PF_PHONET, RTM_NEWADDR,
-                                      addr_doit, NULL, 0);
-       if (err)
-               return err;
-
-       /* Further rtnl_register_module() cannot fail */
-       rtnl_register_module(THIS_MODULE, PF_PHONET, RTM_DELADDR,
-                            addr_doit, NULL, 0);
-       rtnl_register_module(THIS_MODULE, PF_PHONET, RTM_GETADDR,
-                            NULL, getaddr_dumpit, 0);
-       rtnl_register_module(THIS_MODULE, PF_PHONET, RTM_NEWROUTE,
-                            route_doit, NULL, 0);
-       rtnl_register_module(THIS_MODULE, PF_PHONET, RTM_DELROUTE,
-                            route_doit, NULL, 0);
-       rtnl_register_module(THIS_MODULE, PF_PHONET, RTM_GETROUTE,
-                            NULL, route_dumpit, RTNL_FLAG_DUMP_UNLOCKED);
-       return 0;
+       return rtnl_register_many(phonet_rtnl_msg_handlers);
 }