Commit 2dad81ad authored by Florian Westphal's avatar Florian Westphal Committed by Pablo Neira Ayuso

netfilter: ipv6: fix afinfo->route refcnt leak on error

Several callers (h323 conntrack, xt_addrtype) assume that the
returned **dst only needs to be released if the function returns 0.

This is true for the ipv4 implementation, but not for the ipv6 one.

Instead of changing the users, change the ipv6 implementation
to behave like the ipv4 version by only providing the dst_entry result
in the success case.
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent e23ebf0f
...@@ -100,9 +100,16 @@ static int nf_ip6_route(struct net *net, struct dst_entry **dst, ...@@ -100,9 +100,16 @@ static int nf_ip6_route(struct net *net, struct dst_entry **dst,
.pinet6 = (struct ipv6_pinfo *) &fake_pinfo, .pinet6 = (struct ipv6_pinfo *) &fake_pinfo,
}; };
const void *sk = strict ? &fake_sk : NULL; const void *sk = strict ? &fake_sk : NULL;
struct dst_entry *result;
*dst = ip6_route_output(net, sk, &fl->u.ip6); int err;
return (*dst)->error;
result = ip6_route_output(net, sk, &fl->u.ip6);
err = result->error;
if (err)
dst_release(result);
else
*dst = result;
return err;
} }
__sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook, __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment