diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/reassembly.c | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 241b2cc49bf5..0300dcbf1a75 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -670,17 +670,52 @@ static struct ctl_table ip6_frags_ctl_table[] = { | |||
670 | 670 | ||
671 | static int ip6_frags_sysctl_register(struct net *net) | 671 | static int ip6_frags_sysctl_register(struct net *net) |
672 | { | 672 | { |
673 | struct ctl_table *table; | ||
673 | struct ctl_table_header *hdr; | 674 | struct ctl_table_header *hdr; |
674 | 675 | ||
675 | hdr = register_net_sysctl_table(net, net_ipv6_ctl_path, | 676 | table = ip6_frags_ctl_table; |
676 | ip6_frags_ctl_table); | 677 | if (net != &init_net) { |
677 | return hdr == NULL ? -ENOMEM : 0; | 678 | table = kmemdup(table, sizeof(ip6_frags_ctl_table), GFP_KERNEL); |
679 | if (table == NULL) | ||
680 | goto err_alloc; | ||
681 | |||
682 | table[0].mode &= ~0222; | ||
683 | table[1].mode &= ~0222; | ||
684 | table[2].mode &= ~0222; | ||
685 | table[3].mode &= ~0222; | ||
686 | } | ||
687 | |||
688 | hdr = register_net_sysctl_table(net, net_ipv6_ctl_path, table); | ||
689 | if (hdr == NULL) | ||
690 | goto err_reg; | ||
691 | |||
692 | net->ipv6.sysctl.frags_hdr = hdr; | ||
693 | return 0; | ||
694 | |||
695 | err_reg: | ||
696 | if (net != &init_net) | ||
697 | kfree(table); | ||
698 | err_alloc: | ||
699 | return -ENOMEM; | ||
700 | } | ||
701 | |||
702 | static void ip6_frags_sysctl_unregister(struct net *net) | ||
703 | { | ||
704 | struct ctl_table *table; | ||
705 | |||
706 | table = net->ipv6.sysctl.frags_hdr->ctl_table_arg; | ||
707 | unregister_net_sysctl_table(net->ipv6.sysctl.frags_hdr); | ||
708 | kfree(table); | ||
678 | } | 709 | } |
679 | #else | 710 | #else |
680 | static inline int ip6_frags_sysctl_register(struct net *net) | 711 | static inline int ip6_frags_sysctl_register(struct net *net) |
681 | { | 712 | { |
682 | return 0; | 713 | return 0; |
683 | } | 714 | } |
715 | |||
716 | static inline void ip6_frags_sysctl_unregister(struct net *net) | ||
717 | { | ||
718 | } | ||
684 | #endif | 719 | #endif |
685 | 720 | ||
686 | static int ipv6_frags_init_net(struct net *net) | 721 | static int ipv6_frags_init_net(struct net *net) |