Message ID | 20230125105944.GA133314@ubuntu (mailing list archive) |
---|---|
State | Accepted |
Commit | 14caefcf9837a2be765a566005ad82cd0d2a429f |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [v3] net/rose: Fix to not accept on connected socket | expand |
Hello: This patch was applied to netdev/net.git (master) by Jakub Kicinski <kuba@kernel.org>: On Wed, 25 Jan 2023 02:59:44 -0800 you wrote: > If you call listen() and accept() on an already connect()ed > rose socket, accept() can successfully connect. > This is because when the peer socket sends data to sendmsg, > the skb with its own sk stored in the connected socket's > sk->sk_receive_queue is connected, and rose_accept() dequeues > the skb waiting in the sk->sk_receive_queue. > > [...] Here is the summary with links: - [v3] net/rose: Fix to not accept on connected socket https://git.kernel.org/netdev/net/c/14caefcf9837 You are awesome, thank you!
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index 36fefc3957d7..ca2b17f32670 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c @@ -488,6 +488,12 @@ static int rose_listen(struct socket *sock, int backlog) { struct sock *sk = sock->sk; + lock_sock(sk); + if (sock->state != SS_UNCONNECTED) { + release_sock(sk); + return -EINVAL; + } + if (sk->sk_state != TCP_LISTEN) { struct rose_sock *rose = rose_sk(sk); @@ -497,8 +503,10 @@ static int rose_listen(struct socket *sock, int backlog) memset(rose->dest_digis, 0, AX25_ADDR_LEN * ROSE_MAX_DIGIS); sk->sk_max_ack_backlog = backlog; sk->sk_state = TCP_LISTEN; + release_sock(sk); return 0; } + release_sock(sk); return -EOPNOTSUPP; }