diff options
| author | Pablo Neira Ayuso <pablo@netfilter.org> | 2011-06-02 15:08:45 +0200 | 
|---|---|---|
| committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2011-06-06 01:37:02 +0200 | 
| commit | 88ed01d17b44bc2bed4ad4835d3b1099bff3dd71 (patch) | |
| tree | 619e093aecca3e0e1233e7eb62055265c13835e2 | |
| parent | d9be76f38526dccf84062e3ac3ed3a6a97698565 (diff) | |
netfilter: nf_conntrack: fix ct refcount leak in l4proto->error()
This patch fixes a refcount leak of ct objects that may occur if
l4proto->error() assigns one conntrack object to one skbuff. In
that case, we have to skip further processing in nf_conntrack_in().
With this patch, we can also fix wrong return values (-NF_ACCEPT)
for special cases in ICMP[v6] that should not bump the invalid/error
statistic counters.
Reported-by: Zoltan Menyhart <Zoltan.Menyhart@bull.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
| -rw-r--r-- | net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 2 | ||||
| -rw-r--r-- | net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | 2 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_core.c | 3 | 
3 files changed, 5 insertions, 2 deletions
diff --git a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c index 7404bde95994..ab5b27a2916f 100644 --- a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c +++ b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c @@ -160,7 +160,7 @@ icmp_error_message(struct net *net, struct nf_conn *tmpl, struct sk_buff *skb,  	/* Update skb to refer to this connection */  	skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general;  	skb->nfctinfo = *ctinfo; -	return -NF_ACCEPT; +	return NF_ACCEPT;  }  /* Small and modified version of icmp_rcv */ diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c index 1df3c8b6bf47..7c05e7eacbc6 100644 --- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c @@ -177,7 +177,7 @@ icmpv6_error_message(struct net *net, struct nf_conn *tmpl,  	/* Update skb to refer to this connection */  	skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general;  	skb->nfctinfo = *ctinfo; -	return -NF_ACCEPT; +	return NF_ACCEPT;  }  static int diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 0bd568929403..f7af8b866017 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -922,6 +922,9 @@ nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum,  			ret = -ret;  			goto out;  		} +		/* ICMP[v6] protocol trackers may assign one conntrack. */ +		if (skb->nfct) +			goto out;  	}  	ct = resolve_normal_ct(net, tmpl, skb, dataoff, pf, protonum,  | 
