Skip to content

Commit

Permalink
net/x25: Fix to not accept on connected socket
Browse files Browse the repository at this point in the history
When listen() and accept() are called on an x25 socket
that connect() succeeds, accept() succeeds immediately.
This is because x25_connect() queues the skb to
sk->sk_receive_queue, and x25_accept() dequeues it.

This creates a child socket with the sk of the parent
x25 socket, which can cause confusion.

Fix x25_listen() to return -EINVAL if the socket has
already been successfully connect()ed to avoid this issue.

Signed-off-by: Hyunwoo Kim <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
V4bel-theori authored and davem330 committed Jan 25, 2023
1 parent 2a48216 commit f2b0b52
Showing 1 changed file with 6 additions and 0 deletions.
6 changes: 6 additions & 0 deletions net/x25/af_x25.c
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,12 @@ static int x25_listen(struct socket *sock, int backlog)
int rc = -EOPNOTSUPP;

lock_sock(sk);
if (sock->state != SS_UNCONNECTED) {
rc = -EINVAL;
release_sock(sk);
return rc;
}

if (sk->sk_state != TCP_LISTEN) {
memset(&x25_sk(sk)->dest_addr, 0, X25_ADDR_LEN);
sk->sk_max_ack_backlog = backlog;
Expand Down

0 comments on commit f2b0b52

Please sign in to comment.