Commit 35ed3d0fb62804090a3f21a7ce84c538a6ff852f
Committed by
Greg Kroah-Hartman
1 parent
0515423344
tunnels: fix netns vs proto registration ordering
commit d5aa407f59f5b83d2c50ec88f5bf56d40f1f8978 upstream. Same stuff as in ip_gre patch: receive hook can be called before netns setup is done, oopsing in net_generic(). Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Showing 4 changed files with 38 additions and 38 deletions Side-by-side Diff
net/ipv4/ipip.c
... | ... | @@ -830,15 +830,14 @@ |
830 | 830 | |
831 | 831 | printk(banner); |
832 | 832 | |
833 | - if (xfrm4_tunnel_register(&ipip_handler, AF_INET)) { | |
833 | + err = register_pernet_gen_device(&ipip_net_id, &ipip_net_ops); | |
834 | + if (err < 0) | |
835 | + return err; | |
836 | + err = xfrm4_tunnel_register(&ipip_handler, AF_INET); | |
837 | + if (err < 0) { | |
838 | + unregister_pernet_device(&ipip_net_ops); | |
834 | 839 | printk(KERN_INFO "ipip init: can't register tunnel\n"); |
835 | - return -EAGAIN; | |
836 | 840 | } |
837 | - | |
838 | - err = register_pernet_gen_device(&ipip_net_id, &ipip_net_ops); | |
839 | - if (err) | |
840 | - xfrm4_tunnel_deregister(&ipip_handler, AF_INET); | |
841 | - | |
842 | 841 | return err; |
843 | 842 | } |
844 | 843 |
net/ipv6/ip6_tunnel.c
... | ... | @@ -1466,27 +1466,29 @@ |
1466 | 1466 | { |
1467 | 1467 | int err; |
1468 | 1468 | |
1469 | - if (xfrm6_tunnel_register(&ip4ip6_handler, AF_INET)) { | |
1469 | + err = register_pernet_device(&ip6_tnl_net_ops); | |
1470 | + if (err < 0) | |
1471 | + goto out_pernet; | |
1472 | + | |
1473 | + err = xfrm6_tunnel_register(&ip4ip6_handler, AF_INET); | |
1474 | + if (err < 0) { | |
1470 | 1475 | printk(KERN_ERR "ip6_tunnel init: can't register ip4ip6\n"); |
1471 | - err = -EAGAIN; | |
1472 | - goto out; | |
1476 | + goto out_ip4ip6; | |
1473 | 1477 | } |
1474 | 1478 | |
1475 | - if (xfrm6_tunnel_register(&ip6ip6_handler, AF_INET6)) { | |
1479 | + err = xfrm6_tunnel_register(&ip6ip6_handler, AF_INET6); | |
1480 | + if (err < 0) { | |
1476 | 1481 | printk(KERN_ERR "ip6_tunnel init: can't register ip6ip6\n"); |
1477 | - err = -EAGAIN; | |
1478 | - goto unreg_ip4ip6; | |
1482 | + goto out_ip6ip6; | |
1479 | 1483 | } |
1480 | 1484 | |
1481 | - err = register_pernet_gen_device(&ip6_tnl_net_id, &ip6_tnl_net_ops); | |
1482 | - if (err < 0) | |
1483 | - goto err_pernet; | |
1484 | 1485 | return 0; |
1485 | -err_pernet: | |
1486 | - xfrm6_tunnel_deregister(&ip6ip6_handler, AF_INET6); | |
1487 | -unreg_ip4ip6: | |
1486 | + | |
1487 | +out_ip6ip6: | |
1488 | 1488 | xfrm6_tunnel_deregister(&ip4ip6_handler, AF_INET); |
1489 | -out: | |
1489 | +out_ip4ip6: | |
1490 | + unregister_pernet_device(&ip6_tnl_net_ops); | |
1491 | +out_pernet: | |
1490 | 1492 | return err; |
1491 | 1493 | } |
1492 | 1494 |
net/ipv6/sit.c
... | ... | @@ -1086,15 +1086,14 @@ |
1086 | 1086 | |
1087 | 1087 | printk(KERN_INFO "IPv6 over IPv4 tunneling driver\n"); |
1088 | 1088 | |
1089 | - if (xfrm4_tunnel_register(&sit_handler, AF_INET6) < 0) { | |
1090 | - printk(KERN_INFO "sit init: Can't add protocol\n"); | |
1091 | - return -EAGAIN; | |
1092 | - } | |
1093 | - | |
1094 | 1089 | err = register_pernet_gen_device(&sit_net_id, &sit_net_ops); |
1095 | 1090 | if (err < 0) |
1096 | - xfrm4_tunnel_deregister(&sit_handler, AF_INET6); | |
1097 | - | |
1091 | + return err; | |
1092 | + err = xfrm4_tunnel_register(&sit_handler, AF_INET6); | |
1093 | + if (err < 0) { | |
1094 | + unregister_pernet_device(&sit_net_ops); | |
1095 | + printk(KERN_INFO "sit init: Can't add protocol\n"); | |
1096 | + } | |
1098 | 1097 | return err; |
1099 | 1098 | } |
1100 | 1099 |
net/ipv6/xfrm6_tunnel.c
... | ... | @@ -346,36 +346,36 @@ |
346 | 346 | { |
347 | 347 | int rv; |
348 | 348 | |
349 | - rv = xfrm_register_type(&xfrm6_tunnel_type, AF_INET6); | |
349 | + rv = xfrm6_tunnel_spi_init(); | |
350 | 350 | if (rv < 0) |
351 | 351 | goto err; |
352 | + rv = xfrm_register_type(&xfrm6_tunnel_type, AF_INET6); | |
353 | + if (rv < 0) | |
354 | + goto out_type; | |
352 | 355 | rv = xfrm6_tunnel_register(&xfrm6_tunnel_handler, AF_INET6); |
353 | 356 | if (rv < 0) |
354 | - goto unreg; | |
357 | + goto out_xfrm6; | |
355 | 358 | rv = xfrm6_tunnel_register(&xfrm46_tunnel_handler, AF_INET); |
356 | 359 | if (rv < 0) |
357 | - goto dereg6; | |
358 | - rv = xfrm6_tunnel_spi_init(); | |
359 | - if (rv < 0) | |
360 | - goto dereg46; | |
360 | + goto out_xfrm46; | |
361 | 361 | return 0; |
362 | 362 | |
363 | -dereg46: | |
364 | - xfrm6_tunnel_deregister(&xfrm46_tunnel_handler, AF_INET); | |
365 | -dereg6: | |
363 | +out_xfrm46: | |
366 | 364 | xfrm6_tunnel_deregister(&xfrm6_tunnel_handler, AF_INET6); |
367 | -unreg: | |
365 | +out_xfrm6: | |
368 | 366 | xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6); |
367 | +out_type: | |
368 | + xfrm6_tunnel_spi_fini(); | |
369 | 369 | err: |
370 | 370 | return rv; |
371 | 371 | } |
372 | 372 | |
373 | 373 | static void __exit xfrm6_tunnel_fini(void) |
374 | 374 | { |
375 | - xfrm6_tunnel_spi_fini(); | |
376 | 375 | xfrm6_tunnel_deregister(&xfrm46_tunnel_handler, AF_INET); |
377 | 376 | xfrm6_tunnel_deregister(&xfrm6_tunnel_handler, AF_INET6); |
378 | 377 | xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6); |
378 | + xfrm6_tunnel_spi_fini(); | |
379 | 379 | } |
380 | 380 | |
381 | 381 | module_init(xfrm6_tunnel_init); |