Skip to content

Commit d517056

Browse files
q2venPaolo Abeni
authored andcommitted
mctp: Handle error of rtnl_register_module().
Since introduced, mctp 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: 583be98 ("mctp: Add device handling and netlink interface") Fixes: 831119f ("mctp: Add neighbour netlink interface") Fixes: 06d2f4c ("mctp: Add netlink route management") Signed-off-by: Kuniyuki Iwashima <[email protected]> Reviewed-by: Jeremy Kerr <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent cba5e43 commit d517056

File tree

5 files changed

+66
-36
lines changed

5 files changed

+66
-36
lines changed

include/net/mctp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ void mctp_neigh_remove_dev(struct mctp_dev *mdev);
295295
int mctp_routes_init(void);
296296
void mctp_routes_exit(void);
297297

298-
void mctp_device_init(void);
298+
int mctp_device_init(void);
299299
void mctp_device_exit(void);
300300

301301
#endif /* __NET_MCTP_H */

net/mctp/af_mctp.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,10 +756,14 @@ static __init int mctp_init(void)
756756
if (rc)
757757
goto err_unreg_routes;
758758

759-
mctp_device_init();
759+
rc = mctp_device_init();
760+
if (rc)
761+
goto err_unreg_neigh;
760762

761763
return 0;
762764

765+
err_unreg_neigh:
766+
mctp_neigh_exit();
763767
err_unreg_routes:
764768
mctp_routes_exit();
765769
err_unreg_proto:

net/mctp/device.c

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -524,25 +524,31 @@ static struct notifier_block mctp_dev_nb = {
524524
.priority = ADDRCONF_NOTIFY_PRIORITY,
525525
};
526526

527-
void __init mctp_device_init(void)
527+
static const struct rtnl_msg_handler mctp_device_rtnl_msg_handlers[] = {
528+
{THIS_MODULE, PF_MCTP, RTM_NEWADDR, mctp_rtm_newaddr, NULL, 0},
529+
{THIS_MODULE, PF_MCTP, RTM_DELADDR, mctp_rtm_deladdr, NULL, 0},
530+
{THIS_MODULE, PF_MCTP, RTM_GETADDR, NULL, mctp_dump_addrinfo, 0},
531+
};
532+
533+
int __init mctp_device_init(void)
528534
{
529-
register_netdevice_notifier(&mctp_dev_nb);
535+
int err;
530536

531-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_GETADDR,
532-
NULL, mctp_dump_addrinfo, 0);
533-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_NEWADDR,
534-
mctp_rtm_newaddr, NULL, 0);
535-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_DELADDR,
536-
mctp_rtm_deladdr, NULL, 0);
537+
register_netdevice_notifier(&mctp_dev_nb);
537538
rtnl_af_register(&mctp_af_ops);
539+
540+
err = rtnl_register_many(mctp_device_rtnl_msg_handlers);
541+
if (err) {
542+
rtnl_af_unregister(&mctp_af_ops);
543+
unregister_netdevice_notifier(&mctp_dev_nb);
544+
}
545+
546+
return err;
538547
}
539548

540549
void __exit mctp_device_exit(void)
541550
{
551+
rtnl_unregister_many(mctp_device_rtnl_msg_handlers);
542552
rtnl_af_unregister(&mctp_af_ops);
543-
rtnl_unregister(PF_MCTP, RTM_DELADDR);
544-
rtnl_unregister(PF_MCTP, RTM_NEWADDR);
545-
rtnl_unregister(PF_MCTP, RTM_GETADDR);
546-
547553
unregister_netdevice_notifier(&mctp_dev_nb);
548554
}

net/mctp/neigh.c

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -322,22 +322,29 @@ static struct pernet_operations mctp_net_ops = {
322322
.exit = mctp_neigh_net_exit,
323323
};
324324

325+
static const struct rtnl_msg_handler mctp_neigh_rtnl_msg_handlers[] = {
326+
{THIS_MODULE, PF_MCTP, RTM_NEWNEIGH, mctp_rtm_newneigh, NULL, 0},
327+
{THIS_MODULE, PF_MCTP, RTM_DELNEIGH, mctp_rtm_delneigh, NULL, 0},
328+
{THIS_MODULE, PF_MCTP, RTM_GETNEIGH, NULL, mctp_rtm_getneigh, 0},
329+
};
330+
325331
int __init mctp_neigh_init(void)
326332
{
327-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_NEWNEIGH,
328-
mctp_rtm_newneigh, NULL, 0);
329-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_DELNEIGH,
330-
mctp_rtm_delneigh, NULL, 0);
331-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_GETNEIGH,
332-
NULL, mctp_rtm_getneigh, 0);
333-
334-
return register_pernet_subsys(&mctp_net_ops);
333+
int err;
334+
335+
err = register_pernet_subsys(&mctp_net_ops);
336+
if (err)
337+
return err;
338+
339+
err = rtnl_register_many(mctp_neigh_rtnl_msg_handlers);
340+
if (err)
341+
unregister_pernet_subsys(&mctp_net_ops);
342+
343+
return err;
335344
}
336345

337-
void __exit mctp_neigh_exit(void)
346+
void mctp_neigh_exit(void)
338347
{
348+
rtnl_unregister_many(mctp_neigh_rtnl_msg_handlers);
339349
unregister_pernet_subsys(&mctp_net_ops);
340-
rtnl_unregister(PF_MCTP, RTM_GETNEIGH);
341-
rtnl_unregister(PF_MCTP, RTM_DELNEIGH);
342-
rtnl_unregister(PF_MCTP, RTM_NEWNEIGH);
343350
}

net/mctp/route.c

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,26 +1474,39 @@ static struct pernet_operations mctp_net_ops = {
14741474
.exit = mctp_routes_net_exit,
14751475
};
14761476

1477+
static const struct rtnl_msg_handler mctp_route_rtnl_msg_handlers[] = {
1478+
{THIS_MODULE, PF_MCTP, RTM_NEWROUTE, mctp_newroute, NULL, 0},
1479+
{THIS_MODULE, PF_MCTP, RTM_DELROUTE, mctp_delroute, NULL, 0},
1480+
{THIS_MODULE, PF_MCTP, RTM_GETROUTE, NULL, mctp_dump_rtinfo, 0},
1481+
};
1482+
14771483
int __init mctp_routes_init(void)
14781484
{
1485+
int err;
1486+
14791487
dev_add_pack(&mctp_packet_type);
14801488

1481-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_GETROUTE,
1482-
NULL, mctp_dump_rtinfo, 0);
1483-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_NEWROUTE,
1484-
mctp_newroute, NULL, 0);
1485-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_DELROUTE,
1486-
mctp_delroute, NULL, 0);
1489+
err = register_pernet_subsys(&mctp_net_ops);
1490+
if (err)
1491+
goto err_pernet;
1492+
1493+
err = rtnl_register_many(mctp_route_rtnl_msg_handlers);
1494+
if (err)
1495+
goto err_rtnl;
14871496

1488-
return register_pernet_subsys(&mctp_net_ops);
1497+
return 0;
1498+
1499+
err_rtnl:
1500+
unregister_pernet_subsys(&mctp_net_ops);
1501+
err_pernet:
1502+
dev_remove_pack(&mctp_packet_type);
1503+
return err;
14891504
}
14901505

14911506
void mctp_routes_exit(void)
14921507
{
1508+
rtnl_unregister_many(mctp_route_rtnl_msg_handlers);
14931509
unregister_pernet_subsys(&mctp_net_ops);
1494-
rtnl_unregister(PF_MCTP, RTM_DELROUTE);
1495-
rtnl_unregister(PF_MCTP, RTM_NEWROUTE);
1496-
rtnl_unregister(PF_MCTP, RTM_GETROUTE);
14971510
dev_remove_pack(&mctp_packet_type);
14981511
}
14991512

0 commit comments

Comments
 (0)