From 8ae511ab4c587b9dcf300d4cb3b669417c14b9bb Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 25 Aug 2004 06:20:04 -0700 Subject: [PATCH] [NETFILTER]: Fix ip_nat_find_helper() locking. Signed-off-by: Harald Welte Signed-off-by: David S. Miller --- include/linux/netfilter_ipv4/ip_nat_helper.h | 3 +++ net/ipv4/netfilter/ip_nat_core.c | 2 +- net/ipv4/netfilter/ip_nat_helper.c | 8 +++++++- net/ipv4/netfilter/ip_nat_standalone.c | 2 ++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/linux/netfilter_ipv4/ip_nat_helper.h b/include/linux/netfilter_ipv4/ip_nat_helper.h index be6bb082d0ba4..b34e4ce9ee6a5 100644 --- a/include/linux/netfilter_ipv4/ip_nat_helper.h +++ b/include/linux/netfilter_ipv4/ip_nat_helper.h @@ -44,6 +44,9 @@ extern void ip_nat_helper_unregister(struct ip_nat_helper *me); extern struct ip_nat_helper * ip_nat_find_helper(const struct ip_conntrack_tuple *tuple); +extern struct ip_nat_helper * +__ip_nat_find_helper(const struct ip_conntrack_tuple *tuple); + /* These return true or false. */ extern int ip_nat_mangle_tcp_packet(struct sk_buff **skb, struct ip_conntrack *ct, diff --git a/net/ipv4/netfilter/ip_nat_core.c b/net/ipv4/netfilter/ip_nat_core.c index d350134dacb1b..b10d35198d1e8 100644 --- a/net/ipv4/netfilter/ip_nat_core.c +++ b/net/ipv4/netfilter/ip_nat_core.c @@ -635,7 +635,7 @@ ip_nat_setup_info(struct ip_conntrack *conntrack, /* If there's a helper, assign it; based on new tuple. */ if (!conntrack->master) - info->helper = ip_nat_find_helper(&reply); + info->helper = __ip_nat_find_helper(&reply); /* It's done. */ info->initialized |= (1 << HOOK2MANIP(hooknum)); diff --git a/net/ipv4/netfilter/ip_nat_helper.c b/net/ipv4/netfilter/ip_nat_helper.c index 2e8d021aff444..ede6757e54015 100644 --- a/net/ipv4/netfilter/ip_nat_helper.c +++ b/net/ipv4/netfilter/ip_nat_helper.c @@ -420,13 +420,19 @@ int ip_nat_helper_register(struct ip_nat_helper *me) return ret; } +struct ip_nat_helper * +__ip_nat_find_helper(const struct ip_conntrack_tuple *tuple) +{ + return LIST_FIND(&helpers, helper_cmp, struct ip_nat_helper *, tuple); +} + struct ip_nat_helper * ip_nat_find_helper(const struct ip_conntrack_tuple *tuple) { struct ip_nat_helper *h; READ_LOCK(&ip_nat_lock); - h = LIST_FIND(&helpers, helper_cmp, struct ip_nat_helper *, tuple); + h = __ip_nat_find_helper(tuple); READ_UNLOCK(&ip_nat_lock); return h; diff --git a/net/ipv4/netfilter/ip_nat_standalone.c b/net/ipv4/netfilter/ip_nat_standalone.c index 62ef0d1f7554d..fcc74c0facfe2 100644 --- a/net/ipv4/netfilter/ip_nat_standalone.c +++ b/net/ipv4/netfilter/ip_nat_standalone.c @@ -394,4 +394,6 @@ EXPORT_SYMBOL(ip_nat_cheat_check); EXPORT_SYMBOL(ip_nat_mangle_tcp_packet); EXPORT_SYMBOL(ip_nat_mangle_udp_packet); EXPORT_SYMBOL(ip_nat_used_tuple); +EXPORT_SYMBOL(ip_nat_find_helper); +EXPORT_SYMBOL(__ip_nat_find_helper); MODULE_LICENSE("GPL"); -- 2.53.0