Commit fd711436 authored by Mathias Krause's avatar Mathias Krause Committed by Steffen Klassert

vti6: Don't unregister pernet ops twice on init errors

If we fail to register one of the xfrm protocol handlers we will
unregister the pernet ops twice on the error exit path. This will
probably lead to a kernel panic as the double deregistration
leads to a double kfree().

Fix this by removing one of the calls to do it only once.

Fixes: fa9ad96d ("vti6: Update the ipv6 side to use its own...")
Signed-off-by: default avatarMathias Krause <minipli@googlemail.com>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent edb666f0
...@@ -1097,7 +1097,6 @@ static int __init vti6_tunnel_init(void) ...@@ -1097,7 +1097,6 @@ static int __init vti6_tunnel_init(void)
err = xfrm6_protocol_register(&vti_esp6_protocol, IPPROTO_ESP); err = xfrm6_protocol_register(&vti_esp6_protocol, IPPROTO_ESP);
if (err < 0) { if (err < 0) {
unregister_pernet_device(&vti6_net_ops);
pr_err("%s: can't register vti6 protocol\n", __func__); pr_err("%s: can't register vti6 protocol\n", __func__);
goto out; goto out;
...@@ -1106,7 +1105,6 @@ static int __init vti6_tunnel_init(void) ...@@ -1106,7 +1105,6 @@ static int __init vti6_tunnel_init(void)
err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH); err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH);
if (err < 0) { if (err < 0) {
xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
unregister_pernet_device(&vti6_net_ops);
pr_err("%s: can't register vti6 protocol\n", __func__); pr_err("%s: can't register vti6 protocol\n", __func__);
goto out; goto out;
...@@ -1116,7 +1114,6 @@ static int __init vti6_tunnel_init(void) ...@@ -1116,7 +1114,6 @@ static int __init vti6_tunnel_init(void)
if (err < 0) { if (err < 0) {
xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
unregister_pernet_device(&vti6_net_ops);
pr_err("%s: can't register vti6 protocol\n", __func__); pr_err("%s: can't register vti6 protocol\n", __func__);
goto out; goto out;
......
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