Commit c22921df authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Pablo Neira Ayuso
Browse files

netfilter: iptables: Fix potential null-ptr-deref in ip6table_nat_table_init().



ip6table_nat_table_init() accesses net->gen->ptr[ip6table_nat_net_ops.id],
but the function is exposed to user space before the entry is allocated
via register_pernet_subsys().

Let's call register_pernet_subsys() before xt_register_template().

Fixes: fdacd57c ("netfilter: x_tables: never register tables by default")
Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 5830aa86
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -147,23 +147,27 @@ static struct pernet_operations ip6table_nat_net_ops = {

static int __init ip6table_nat_init(void)
{
	int ret = xt_register_template(&nf_nat_ipv6_table,
				       ip6table_nat_table_init);
	int ret;

	/* net->gen->ptr[ip6table_nat_net_id] must be allocated
	 * before calling ip6t_nat_register_lookups().
	 */
	ret = register_pernet_subsys(&ip6table_nat_net_ops);
	if (ret < 0)
		return ret;

	ret = register_pernet_subsys(&ip6table_nat_net_ops);
	ret = xt_register_template(&nf_nat_ipv6_table,
				   ip6table_nat_table_init);
	if (ret)
		xt_unregister_template(&nf_nat_ipv6_table);
		unregister_pernet_subsys(&ip6table_nat_net_ops);

	return ret;
}

static void __exit ip6table_nat_exit(void)
{
	unregister_pernet_subsys(&ip6table_nat_net_ops);
	xt_unregister_template(&nf_nat_ipv6_table);
	unregister_pernet_subsys(&ip6table_nat_net_ops);
}

module_init(ip6table_nat_init);