Unverified Commit 12a1f34e authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!9907 sock_map: avoid race between sock_map_close and sk_psock_put

parents 6cc9c713 2f8cfd3a
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -1604,18 +1604,22 @@ void sock_map_close(struct sock *sk, long timeout)

	lock_sock(sk);
	rcu_read_lock();
	psock = sk_psock_get(sk);
	if (unlikely(!psock)) {
		rcu_read_unlock();
		release_sock(sk);
		saved_close = READ_ONCE(sk->sk_prot)->close;
	} else {
	psock = sk_psock(sk);
	if (likely(psock)) {
		saved_close = psock->saved_close;
		sock_map_remove_links(sk, psock);
		psock = sk_psock_get(sk);
		if (unlikely(!psock))
			goto no_psock;
		rcu_read_unlock();
		sk_psock_stop(psock, true);
		sk_psock_put(sk, psock);
		release_sock(sk);
	} else {
		saved_close = READ_ONCE(sk->sk_prot)->close;
no_psock:
		rcu_read_unlock();
		release_sock(sk);
	}
	/* Make sure we do not recurse. This is a bug.
	 * Leak the socket instead of crashing on a stack overflow.