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

Commit bd2f4c7c authored by YueHaibing's avatar YueHaibing Committed by Greg Kroah-Hartman
Browse files

can: gw: Fix error path of cgw_module_init



[ Upstream commit b7a14297f102b6e2ce6f16feffebbb9bde1e9b55 ]

This patch add error path for cgw_module_init to avoid possible crash if
some error occurs.

Fixes: c1aabdf3 ("can-gw: add netlink based CAN routing")
Signed-off-by: default avatarYueHaibing <yuehaibing@huawei.com>
Acked-by: default avatarOliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 32571035
Loading
Loading
Loading
Loading
+33 −15
Original line number Diff line number Diff line
@@ -1046,32 +1046,50 @@ static __init int cgw_module_init(void)
	pr_info("can: netlink gateway (rev " CAN_GW_VERSION ") max_hops=%d\n",
		max_hops);

	register_pernet_subsys(&cangw_pernet_ops);
	ret = register_pernet_subsys(&cangw_pernet_ops);
	if (ret)
		return ret;

	ret = -ENOMEM;
	cgw_cache = kmem_cache_create("can_gw", sizeof(struct cgw_job),
				      0, 0, NULL);

	if (!cgw_cache)
		return -ENOMEM;
		goto out_cache_create;

	/* set notifier */
	notifier.notifier_call = cgw_notifier;
	register_netdevice_notifier(&notifier);
	ret = register_netdevice_notifier(&notifier);
	if (ret)
		goto out_register_notifier;

	ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_GETROUTE,
				   NULL, cgw_dump_jobs, 0);
	if (ret) {
		unregister_netdevice_notifier(&notifier);
		kmem_cache_destroy(cgw_cache);
		return -ENOBUFS;
	}
	if (ret)
		goto out_rtnl_register1;

	/* Only the first call to rtnl_register_module can fail */
	rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE,
	ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE,
				   cgw_create_job, NULL, 0);
	rtnl_register_module(THIS_MODULE, PF_CAN, RTM_DELROUTE,
	if (ret)
		goto out_rtnl_register2;
	ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_DELROUTE,
				   cgw_remove_job, NULL, 0);
	if (ret)
		goto out_rtnl_register3;

	return 0;

out_rtnl_register3:
	rtnl_unregister(PF_CAN, RTM_NEWROUTE);
out_rtnl_register2:
	rtnl_unregister(PF_CAN, RTM_GETROUTE);
out_rtnl_register1:
	unregister_netdevice_notifier(&notifier);
out_register_notifier:
	kmem_cache_destroy(cgw_cache);
out_cache_create:
	unregister_pernet_subsys(&cangw_pernet_ops);

	return ret;
}

static __exit void cgw_module_exit(void)