Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit f4df31a

Browse files
q2vengregkh
authored andcommitted
mctp: Handle error of rtnl_register_module().
[ Upstream commit d517056 ] 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]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 60bfd34 commit f4df31a

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
@@ -293,7 +293,7 @@ void mctp_neigh_remove_dev(struct mctp_dev *mdev);
293293
int mctp_routes_init(void);
294294
void mctp_routes_exit(void);
295295

296-
void mctp_device_init(void);
296+
int mctp_device_init(void);
297297
void mctp_device_exit(void);
298298

299299
#endif /* __NET_MCTP_H */

net/mctp/af_mctp.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,10 +676,14 @@ static __init int mctp_init(void)
676676
if (rc)
677677
goto err_unreg_routes;
678678

679-
mctp_device_init();
679+
rc = mctp_device_init();
680+
if (rc)
681+
goto err_unreg_neigh;
680682

681683
return 0;
682684

685+
err_unreg_neigh:
686+
mctp_neigh_exit();
683687
err_unreg_routes:
684688
mctp_routes_exit();
685689
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
@@ -1410,26 +1410,39 @@ static struct pernet_operations mctp_net_ops = {
14101410
.exit = mctp_routes_net_exit,
14111411
};
14121412

1413+
static const struct rtnl_msg_handler mctp_route_rtnl_msg_handlers[] = {
1414+
{THIS_MODULE, PF_MCTP, RTM_NEWROUTE, mctp_newroute, NULL, 0},
1415+
{THIS_MODULE, PF_MCTP, RTM_DELROUTE, mctp_delroute, NULL, 0},
1416+
{THIS_MODULE, PF_MCTP, RTM_GETROUTE, NULL, mctp_dump_rtinfo, 0},
1417+
};
1418+
14131419
int __init mctp_routes_init(void)
14141420
{
1421+
int err;
1422+
14151423
dev_add_pack(&mctp_packet_type);
14161424

1417-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_GETROUTE,
1418-
NULL, mctp_dump_rtinfo, 0);
1419-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_NEWROUTE,
1420-
mctp_newroute, NULL, 0);
1421-
rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_DELROUTE,
1422-
mctp_delroute, NULL, 0);
1425+
err = register_pernet_subsys(&mctp_net_ops);
1426+
if (err)
1427+
goto err_pernet;
1428+
1429+
err = rtnl_register_many(mctp_route_rtnl_msg_handlers);
1430+
if (err)
1431+
goto err_rtnl;
14231432

1424-
return register_pernet_subsys(&mctp_net_ops);
1433+
return 0;
1434+
1435+
err_rtnl:
1436+
unregister_pernet_subsys(&mctp_net_ops);
1437+
err_pernet:
1438+
dev_remove_pack(&mctp_packet_type);
1439+
return err;
14251440
}
14261441

14271442
void mctp_routes_exit(void)
14281443
{
1444+
rtnl_unregister_many(mctp_route_rtnl_msg_handlers);
14291445
unregister_pernet_subsys(&mctp_net_ops);
1430-
rtnl_unregister(PF_MCTP, RTM_DELROUTE);
1431-
rtnl_unregister(PF_MCTP, RTM_NEWROUTE);
1432-
rtnl_unregister(PF_MCTP, RTM_GETROUTE);
14331446
dev_remove_pack(&mctp_packet_type);
14341447
}
14351448

0 commit comments

Comments
 (0)