Commit 584eab29 authored by Taehee Yoo's avatar Taehee Yoo Committed by Pablo Neira Ayuso
Browse files

netfilter: add missing error handling code for register functions



register_{netdevice/inetaddr/inet6addr}_notifier may return an error
value, this patch adds the code to handle these error paths.

Signed-off-by: default avatarTaehee Yoo <ap420073@gmail.com>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 508b0904
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ nf_nat_masquerade_ipv4(struct sk_buff *skb, unsigned int hooknum,
		       const struct nf_nat_range2 *range,
		       const struct net_device *out);

void nf_nat_masquerade_ipv4_register_notifier(void);
int nf_nat_masquerade_ipv4_register_notifier(void);
void nf_nat_masquerade_ipv4_unregister_notifier(void);

#endif /*_NF_NAT_MASQUERADE_IPV4_H_ */
+1 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
unsigned int
nf_nat_masquerade_ipv6(struct sk_buff *skb, const struct nf_nat_range2 *range,
		       const struct net_device *out);
void nf_nat_masquerade_ipv6_register_notifier(void);
int nf_nat_masquerade_ipv6_register_notifier(void);
void nf_nat_masquerade_ipv6_unregister_notifier(void);

#endif /* _NF_NAT_MASQUERADE_IPV6_H_ */
+5 −2
Original line number Diff line number Diff line
@@ -81,9 +81,12 @@ static int __init masquerade_tg_init(void)
	int ret;

	ret = xt_register_target(&masquerade_tg_reg);
	if (ret)
		return ret;

	if (ret == 0)
		nf_nat_masquerade_ipv4_register_notifier();
	ret = nf_nat_masquerade_ipv4_register_notifier();
	if (ret)
		xt_unregister_target(&masquerade_tg_reg);

	return ret;
}
+17 −4
Original line number Diff line number Diff line
@@ -149,16 +149,29 @@ static struct notifier_block masq_inet_notifier = {

static atomic_t masquerade_notifier_refcount = ATOMIC_INIT(0);

void nf_nat_masquerade_ipv4_register_notifier(void)
int nf_nat_masquerade_ipv4_register_notifier(void)
{
	int ret;

	/* check if the notifier was already set */
	if (atomic_inc_return(&masquerade_notifier_refcount) > 1)
		return;
		return 0;

	/* Register for device down reports */
	register_netdevice_notifier(&masq_dev_notifier);
	ret = register_netdevice_notifier(&masq_dev_notifier);
	if (ret)
		goto err_dec;
	/* Register IP address change reports */
	register_inetaddr_notifier(&masq_inet_notifier);
	ret = register_inetaddr_notifier(&masq_inet_notifier);
	if (ret)
		goto err_unregister;

	return ret;
err_unregister:
	unregister_netdevice_notifier(&masq_dev_notifier);
err_dec:
	atomic_dec(&masquerade_notifier_refcount);
	return ret;
}
EXPORT_SYMBOL_GPL(nf_nat_masquerade_ipv4_register_notifier);

+3 −1
Original line number Diff line number Diff line
@@ -69,7 +69,9 @@ static int __init nft_masq_ipv4_module_init(void)
	if (ret < 0)
		return ret;

	nf_nat_masquerade_ipv4_register_notifier();
	ret = nf_nat_masquerade_ipv4_register_notifier();
	if (ret)
		nft_unregister_expr(&nft_masq_ipv4_type);

	return ret;
}
Loading