diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2005-01-14 04:41:55 -0800 |
---|---|---|
committer | David S. Miller <davem@nuts.davemloft.net> | 2005-01-14 04:41:55 -0800 |
commit | d96524e48315ede2b9d61726ffe1139987b3cf47 (patch) | |
tree | 7ab20e275d8520ac1fa7b7cd905fc8823239a7d9 /net | |
parent | d70ff6fd4876213458def03df3138f81399ccc26 (diff) | |
download | history-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.c | 6 |
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); + } } } |