Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0b7e7dc authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'ipv6-fix-error-path-of-inet6_init'



Sabrina Dubroca says:

====================
ipv6: fix error path of inet6_init()

The error path of inet6_init() can trigger multiple kernel panics,
mostly due to wrong ordering of cleanups. This series fixes those
issues.
====================

Reviewed-by: default avatarXin Long <lucien.xin@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 85eb9af1 f707ef61
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -324,6 +324,10 @@ void rtnl_unregister_all(int protocol)

	rtnl_lock();
	tab = rtnl_msg_handlers[protocol];
	if (!tab) {
		rtnl_unlock();
		return;
	}
	RCU_INIT_POINTER(rtnl_msg_handlers[protocol], NULL);
	for (msgindex = 0; msgindex < RTM_NR_MSGTYPES; msgindex++) {
		link = tab[msgindex];
+5 −5
Original line number Diff line number Diff line
@@ -938,14 +938,14 @@ static int __init inet6_init(void)

	err = proto_register(&pingv6_prot, 1);
	if (err)
		goto out_unregister_ping_proto;
		goto out_unregister_raw_proto;

	/* We MUST register RAW sockets before we create the ICMP6,
	 * IGMP6, or NDISC control sockets.
	 */
	err = rawv6_init();
	if (err)
		goto out_unregister_raw_proto;
		goto out_unregister_ping_proto;

	/* Register the family here so that the init calls below will
	 * be able to create sockets. (?? is this dangerous ??)
@@ -1113,11 +1113,11 @@ static int __init inet6_init(void)
igmp_fail:
	ndisc_cleanup();
ndisc_fail:
	ip6_mr_cleanup();
	icmpv6_cleanup();
icmp_fail:
	unregister_pernet_subsys(&inet6_net_ops);
	ip6_mr_cleanup();
ipmr_fail:
	icmpv6_cleanup();
	unregister_pernet_subsys(&inet6_net_ops);
register_pernet_fail:
	sock_unregister(PF_INET6);
	rtnl_unregister_all(PF_INET6);