mirror of
https://github.com/Divested-Mobile/DivestOS-Build.git
synced 2024-12-24 06:59:27 -05:00
56 lines
1.6 KiB
Diff
56 lines
1.6 KiB
Diff
From 43a6684519ab0a6c52024b5e25322476cabad893 Mon Sep 17 00:00:00 2001
|
|
From: Eric Dumazet <edumazet@google.com>
|
|
Date: Fri, 24 Mar 2017 19:36:13 -0700
|
|
Subject: ping: implement proper locking
|
|
|
|
We got a report of yet another bug in ping
|
|
|
|
http://www.openwall.com/lists/oss-security/2017/03/24/6
|
|
|
|
->disconnect() is not called with socket lock held.
|
|
|
|
Fix this by acquiring ping rwlock earlier.
|
|
|
|
Thanks to Daniel, Alexander and Andrey for letting us know this problem.
|
|
|
|
Fixes: c319b4d76b9e ("net: ipv4: add IPPROTO_ICMP socket kind")
|
|
Signed-off-by: Eric Dumazet <edumazet@google.com>
|
|
Reported-by: Daniel Jiang <danieljiang0415@gmail.com>
|
|
Reported-by: Solar Designer <solar@openwall.com>
|
|
Reported-by: Andrey Konovalov <andreyknvl@google.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
net/ipv4/ping.c | 5 +++--
|
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
|
|
(limited to 'net/ipv4/ping.c')
|
|
|
|
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
|
|
index 2af6244..ccfbce1 100644
|
|
--- a/net/ipv4/ping.c
|
|
+++ b/net/ipv4/ping.c
|
|
@@ -156,17 +156,18 @@ int ping_hash(struct sock *sk)
|
|
void ping_unhash(struct sock *sk)
|
|
{
|
|
struct inet_sock *isk = inet_sk(sk);
|
|
+
|
|
pr_debug("ping_unhash(isk=%p,isk->num=%u)\n", isk, isk->inet_num);
|
|
+ write_lock_bh(&ping_table.lock);
|
|
if (sk_hashed(sk)) {
|
|
- write_lock_bh(&ping_table.lock);
|
|
hlist_nulls_del(&sk->sk_nulls_node);
|
|
sk_nulls_node_init(&sk->sk_nulls_node);
|
|
sock_put(sk);
|
|
isk->inet_num = 0;
|
|
isk->inet_sport = 0;
|
|
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
|
|
- write_unlock_bh(&ping_table.lock);
|
|
}
|
|
+ write_unlock_bh(&ping_table.lock);
|
|
}
|
|
EXPORT_SYMBOL_GPL(ping_unhash);
|
|
|
|
--
|
|
cgit v1.1
|
|
|