Commit b5e837c8 authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Paolo Abeni
Browse files

phonet: Handle error of rtnl_register_module().



Before commit addf9b90 ("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: addf9b90 ("net: rtnetlink: use rcu to free rtnl message handlers")
Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Acked-by: default avatarRémi Denis-Courmont <courmisch@gmail.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 5be2062e
Loading
Loading
Loading
Loading
+11 −17
Original line number Diff line number Diff line
@@ -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);
}