Skip to content
This repository was archived by the owner on Oct 31, 2024. It is now read-only.

Commit 60bfd34

Browse files
q2vengregkh
authored andcommitted
bridge: Handle error of rtnl_register_module().
[ Upstream commit cba5e43 ] Since introduced, br_vlan_rtnl_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: 8dcea18 ("net: bridge: vlan: add rtm definitions and dump support") Fixes: f26b296 ("net: bridge: vlan: add new rtm message support") Fixes: adb3ce9 ("net: bridge: vlan: add del rtm message support") Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Acked-by: Nikolay Aleksandrov <razor@blackwall.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent ca15d28 commit 60bfd34

File tree

3 files changed

+17
-13
lines changed

3 files changed

+17
-13
lines changed

net/bridge/br_netlink.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -1905,7 +1905,10 @@ int __init br_netlink_init(void)
19051905
{
19061906
int err;
19071907

1908-
br_vlan_rtnl_init();
1908+
err = br_vlan_rtnl_init();
1909+
if (err)
1910+
goto out;
1911+
19091912
rtnl_af_register(&br_af_ops);
19101913

19111914
err = rtnl_link_register(&br_link_ops);
@@ -1916,6 +1919,7 @@ int __init br_netlink_init(void)
19161919

19171920
out_af:
19181921
rtnl_af_unregister(&br_af_ops);
1922+
out:
19191923
return err;
19201924
}
19211925

net/bridge/br_private.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -1547,7 +1547,7 @@ void br_vlan_get_stats(const struct net_bridge_vlan *v,
15471547
void br_vlan_port_event(struct net_bridge_port *p, unsigned long event);
15481548
int br_vlan_bridge_event(struct net_device *dev, unsigned long event,
15491549
void *ptr);
1550-
void br_vlan_rtnl_init(void);
1550+
int br_vlan_rtnl_init(void);
15511551
void br_vlan_rtnl_uninit(void);
15521552
void br_vlan_notify(const struct net_bridge *br,
15531553
const struct net_bridge_port *p,
@@ -1778,8 +1778,9 @@ static inline int br_vlan_bridge_event(struct net_device *dev,
17781778
return 0;
17791779
}
17801780

1781-
static inline void br_vlan_rtnl_init(void)
1781+
static inline int br_vlan_rtnl_init(void)
17821782
{
1783+
return 0;
17831784
}
17841785

17851786
static inline void br_vlan_rtnl_uninit(void)

net/bridge/br_vlan.c

+9-10
Original file line numberDiff line numberDiff line change
@@ -2296,19 +2296,18 @@ static int br_vlan_rtm_process(struct sk_buff *skb, struct nlmsghdr *nlh,
22962296
return err;
22972297
}
22982298

2299-
void br_vlan_rtnl_init(void)
2299+
static const struct rtnl_msg_handler br_vlan_rtnl_msg_handlers[] = {
2300+
{THIS_MODULE, PF_BRIDGE, RTM_NEWVLAN, br_vlan_rtm_process, NULL, 0},
2301+
{THIS_MODULE, PF_BRIDGE, RTM_DELVLAN, br_vlan_rtm_process, NULL, 0},
2302+
{THIS_MODULE, PF_BRIDGE, RTM_GETVLAN, NULL, br_vlan_rtm_dump, 0},
2303+
};
2304+
2305+
int br_vlan_rtnl_init(void)
23002306
{
2301-
rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_GETVLAN, NULL,
2302-
br_vlan_rtm_dump, 0);
2303-
rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_NEWVLAN,
2304-
br_vlan_rtm_process, NULL, 0);
2305-
rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_DELVLAN,
2306-
br_vlan_rtm_process, NULL, 0);
2307+
return rtnl_register_many(br_vlan_rtnl_msg_handlers);
23072308
}
23082309

23092310
void br_vlan_rtnl_uninit(void)
23102311
{
2311-
rtnl_unregister(PF_BRIDGE, RTM_GETVLAN);
2312-
rtnl_unregister(PF_BRIDGE, RTM_NEWVLAN);
2313-
rtnl_unregister(PF_BRIDGE, RTM_DELVLAN);
2312+
rtnl_unregister_many(br_vlan_rtnl_msg_handlers);
23142313
}

0 commit comments

Comments
 (0)