diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index c84a320..b294b92 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -480,12 +480,16 @@ int inet_dgram_connect(struct socket *so { struct sock *sk = sock->sk; - if (uaddr->sa_family == AF_UNSPEC) - return sk->sk_prot->disconnect(sk, flags); + if (uaddr->sa_family == AF_UNSPEC) { + if (sock->state != SS_UNCONNECTED) + return sk->sk_prot->disconnect(sk, flags); + else + return 0; + } if (!inet_sk(sk)->num && inet_autobind(sk)) return -EAGAIN; - return sk->sk_prot->connect(sk, (struct sockaddr *)uaddr, addr_len); + return sk->sk_prot->connect(sk, uaddr, addr_len); } static long inet_wait_for_connect(struct sock *sk, long timeo) @@ -525,8 +529,11 @@ int inet_stream_connect(struct socket *s lock_sock(sk); if (uaddr->sa_family == AF_UNSPEC) { - err = sk->sk_prot->disconnect(sk, flags); - sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED; + if (sock->state != SS_UNCONNECTED) { + err = sk->sk_prot->disconnect(sk, flags); + sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED; + } else + err = 0; goto out; }