diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2024-07-15 14:03:44 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2024-07-15 14:03:44 -0700 | 
| commit | a23e1966932464e1c5226cb9ac4ce1d5fc10ba22 (patch) | |
| tree | bf5f1b57faa01ca31656bfc48c7d6b6f0bc39189 /net/unix/unix_bpf.c | |
| parent | 7c7b1be19b228b450c2945ec379d7fc6bfef9852 (diff) | |
| parent | f3efefb6fdcce604413135bd8d4c5568e53a1f13 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.11 merge window.
Diffstat (limited to 'net/unix/unix_bpf.c')
| -rw-r--r-- | net/unix/unix_bpf.c | 20 | 
1 files changed, 20 insertions, 0 deletions
diff --git a/net/unix/unix_bpf.c b/net/unix/unix_bpf.c index 2f9d8271c6ec..bd84785bf8d6 100644 --- a/net/unix/unix_bpf.c +++ b/net/unix/unix_bpf.c @@ -159,12 +159,32 @@ int unix_dgram_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool re  int unix_stream_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)  { +	struct sock *sk_pair; + +	/* Restore does not decrement the sk_pair reference yet because we must +	 * keep the a reference to the socket until after an RCU grace period +	 * and any pending sends have completed. +	 */  	if (restore) {  		sk->sk_write_space = psock->saved_write_space;  		sock_replace_proto(sk, psock->sk_proto);  		return 0;  	} +	/* psock_update_sk_prot can be called multiple times if psock is +	 * added to multiple maps and/or slots in the same map. There is +	 * also an edge case where replacing a psock with itself can trigger +	 * an extra psock_update_sk_prot during the insert process. So it +	 * must be safe to do multiple calls. Here we need to ensure we don't +	 * increment the refcnt through sock_hold many times. There will only +	 * be a single matching destroy operation. +	 */ +	if (!psock->sk_pair) { +		sk_pair = unix_peer(sk); +		sock_hold(sk_pair); +		psock->sk_pair = sk_pair; +	} +  	unix_stream_bpf_check_needs_rebuild(psock->sk_proto);  	sock_replace_proto(sk, &unix_stream_bpf_prot);  	return 0;  | 
