aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2005-01-14 04:41:55 -0800
committerDavid S. Miller <davem@nuts.davemloft.net>2005-01-14 04:41:55 -0800
commitd96524e48315ede2b9d61726ffe1139987b3cf47 (patch)
tree7ab20e275d8520ac1fa7b7cd905fc8823239a7d9 /net
parentd70ff6fd4876213458def03df3138f81399ccc26 (diff)
downloadhistory-d96524e48315ede2b9d61726ffe1139987b3cf47.tar.gz
[IPV6]: Fix locking in ip6_dst_lookup().
The caller does not necessarily have the socket locked (udpv6sendmsg() is one such case) so we have to use sk_dst_check() instead of __sk_dst_check(). Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/ipv6/ip6_output.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 37abe7141d1467..81a016ecb34cc5 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -745,7 +745,7 @@ int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl)
if (sk) {
struct ipv6_pinfo *np = inet6_sk(sk);
- *dst = __sk_dst_check(sk, np->dst_cookie);
+ *dst = sk_dst_check(sk, np->dst_cookie);
if (*dst) {
struct rt6_info *rt = (struct rt6_info*)*dst;
@@ -772,9 +772,9 @@ int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl)
&& (np->daddr_cache == NULL ||
!ipv6_addr_equal(&fl->fl6_dst, np->daddr_cache)))
|| (fl->oif && fl->oif != (*dst)->dev->ifindex)) {
+ dst_release(*dst);
*dst = NULL;
- } else
- dst_hold(*dst);
+ }
}
}