Re: [PATCH] ipv4: ping: Fix potential use-after-free bug
From: David Ahern <dsahern@kernel.org>
Date: 2022-09-18 15:30:29
On 9/16/22 4:07 AM, Liang He wrote:
In ping_unhash(), we should move sock_put(sk) after any possible access point as the put function may free the object.
unhash handlers are called from sk_common_release which still has a reference on the sock, so not really going to hit a UAF. I do agree that it does not read correctly to 'put' a reference then continue using the object. ie., the put should be moved to the end like you have here. This is more of a tidiness exercise than a need to backport to stable kernels.
quoted hunk ↗ jump to hunk
Fixes: c319b4d76b9e ("net: ipv4: add IPPROTO_ICMP socket kind") Signed-off-by: Liang He <redacted> --- I have found other places containing similar code patterns. net/ipv4/ping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index b83c2bd9d722..f90c86d37ffc 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c@@ -157,10 +157,10 @@ void ping_unhash(struct sock *sk) spin_lock(&ping_table.lock); if (sk_hashed(sk)) { hlist_nulls_del_init_rcu(&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); + sock_put(sk); } spin_unlock(&ping_table.lock); }