| .. | .. |
|---|
| 400 | 400 | struct sock *sk = sock->sk; |
|---|
| 401 | 401 | |
|---|
| 402 | 402 | lock_sock(sk); |
|---|
| 403 | + if (sock->state != SS_UNCONNECTED) { |
|---|
| 404 | + release_sock(sk); |
|---|
| 405 | + return -EINVAL; |
|---|
| 406 | + } |
|---|
| 407 | + |
|---|
| 403 | 408 | if (sk->sk_state != TCP_LISTEN) { |
|---|
| 404 | 409 | memset(&nr_sk(sk)->user_addr, 0, AX25_ADDR_LEN); |
|---|
| 405 | 410 | sk->sk_max_ack_backlog = backlog; |
|---|
| .. | .. |
|---|
| 655 | 660 | goto out_release; |
|---|
| 656 | 661 | } |
|---|
| 657 | 662 | |
|---|
| 663 | + if (sock->state == SS_CONNECTING) { |
|---|
| 664 | + err = -EALREADY; |
|---|
| 665 | + goto out_release; |
|---|
| 666 | + } |
|---|
| 667 | + |
|---|
| 658 | 668 | sk->sk_state = TCP_CLOSE; |
|---|
| 659 | 669 | sock->state = SS_UNCONNECTED; |
|---|
| 660 | 670 | |
|---|