diff options
author | David S. Miller <davem@davemloft.net> | 2016-11-03 15:25:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-11-03 15:25:27 -0400 |
commit | d3bc29a4b3778251b7eeadc9eadb8ba2ce3e6c5f (patch) | |
tree | b63652740c8a5abdf0dbec583777993e2ba2209d | |
parent | 17197236d62c44da127be461c63ac5cc2cce1e53 (diff) | |
parent | 9999370faed945be2913cd34aa24e84317a0ceda (diff) | |
download | net-next-d3bc29a4b3778251b7eeadc9eadb8ba2ce3e6c5f.tar.gz |
Merge branch 'diag-raw-fixes'
Cyrill Gorcunov says:
====================
net: Fixes for raw diag sockets handling
Hi! Here are a few fixes for raw-diag sockets handling: missing
sock_put call and jump for exiting from nested cycle. I made
patches for iproute2 as well so will send them out soon.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv4/raw_diag.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/net/ipv4/raw_diag.c b/net/ipv4/raw_diag.c index be930908bcf982..e1a51ca68d23c3 100644 --- a/net/ipv4/raw_diag.c +++ b/net/ipv4/raw_diag.c @@ -79,10 +79,11 @@ static struct sock *raw_sock_get(struct net *net, const struct inet_diag_req_v2 * hashinfo->lock here. */ sock_hold(sk); - break; + goto out_unlock; } } } +out_unlock: read_unlock(&hashinfo->lock); return sk ? sk : ERR_PTR(-ENOENT); @@ -205,11 +206,14 @@ static int raw_diag_destroy(struct sk_buff *in_skb, { struct net *net = sock_net(in_skb->sk); struct sock *sk; + int err; sk = raw_sock_get(net, r); if (IS_ERR(sk)) return PTR_ERR(sk); - return sock_diag_destroy(sk, ECONNABORTED); + err = sock_diag_destroy(sk, ECONNABORTED); + sock_put(sk); + return err; } #endif |