Commit 35ed3d0fb62804090a3f21a7ce84c538a6ff852f

Authored by Alexey Dobriyan
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

... ... @@ -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  
... ... @@ -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);