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

can: gw: Fix error path of cgw_module_init

[ Upstream commit b7a14297 ]

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
...@@ -1046,32 +1046,50 @@ static __init int cgw_module_init(void) ...@@ -1046,32 +1046,50 @@ static __init int cgw_module_init(void)
pr_info("can: netlink gateway (rev " CAN_GW_VERSION ") max_hops=%d\n", pr_info("can: netlink gateway (rev " CAN_GW_VERSION ") max_hops=%d\n",
max_hops); 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), cgw_cache = kmem_cache_create("can_gw", sizeof(struct cgw_job),
0, 0, NULL); 0, 0, NULL);
if (!cgw_cache) if (!cgw_cache)
return -ENOMEM; goto out_cache_create;
/* set notifier */ /* set notifier */
notifier.notifier_call = cgw_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, ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_GETROUTE,
NULL, cgw_dump_jobs, 0); NULL, cgw_dump_jobs, 0);
if (ret) { if (ret)
unregister_netdevice_notifier(&notifier); goto out_rtnl_register1;
kmem_cache_destroy(cgw_cache);
return -ENOBUFS;
}
/* Only the first call to rtnl_register_module can fail */ ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE,
rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE,
cgw_create_job, NULL, 0); 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); cgw_remove_job, NULL, 0);
if (ret)
goto out_rtnl_register3;
return 0; 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) static __exit void cgw_module_exit(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment