Patchwork [ipsec,1/3] vti6: Don't unregister pernet ops twice on init errors

login
register
mail settings
Submitter Mathias Krause
Date May 9, 2014, 9:43 p.m.
Message ID <1399671822-12842-2-git-send-email-minipli@googlemail.com>
Download mbox | patch
Permalink /patch/347565/
State Awaiting Upstream
Delegated to: David Miller
Headers show

Comments

Mathias Krause - May 9, 2014, 9:43 p.m.
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: fa9ad96d49 ("vti6: Update the ipv6 side to use its own...")
Signed-off-by: Mathias Krause <minipli@googlemail.com>
---
 net/ipv6/ip6_vti.c |    3 ---
 1 file changed, 3 deletions(-)
Steffen Klassert - May 13, 2014, 8:35 a.m.
On Fri, May 09, 2014 at 11:43:40PM +0200, Mathias Krause wrote:
> 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: fa9ad96d49 ("vti6: Update the ipv6 side to use its own...")
> Signed-off-by: Mathias Krause <minipli@googlemail.com>

Applied to the ipsec tree, thanks!
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index b7c0f82714..a51100379f 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -1097,7 +1097,6 @@  static int __init vti6_tunnel_init(void)
 
 	err = xfrm6_protocol_register(&vti_esp6_protocol, IPPROTO_ESP);
 	if (err < 0) {
-		unregister_pernet_device(&vti6_net_ops);
 		pr_err("%s: can't register vti6 protocol\n", __func__);
 
 		goto out;
@@ -1106,7 +1105,6 @@  static int __init vti6_tunnel_init(void)
 	err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH);
 	if (err < 0) {
 		xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
-		unregister_pernet_device(&vti6_net_ops);
 		pr_err("%s: can't register vti6 protocol\n", __func__);
 
 		goto out;
@@ -1116,7 +1114,6 @@  static int __init vti6_tunnel_init(void)
 	if (err < 0) {
 		xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
 		xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
-		unregister_pernet_device(&vti6_net_ops);
 		pr_err("%s: can't register vti6 protocol\n", __func__);
 
 		goto out;