Calling connect() with AF_UNSPEC will disconnect a socket, but we don't
need to do any work if the socket isn't currently connected.
Signed-off-by: Brian Haley <[EMAIL PROTECTED]>
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;
}