|
@@ -1084,9 +1084,12 @@ static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg,
|
|
|
{
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
|
+ struct sockaddr *uaddr = msg->msg_name;
|
|
|
int err, flags;
|
|
|
|
|
|
- if (!(sysctl_tcp_fastopen & TFO_CLIENT_ENABLE))
|
|
|
+ if (!(sysctl_tcp_fastopen & TFO_CLIENT_ENABLE) ||
|
|
|
+ (uaddr && msg->msg_namelen >= sizeof(uaddr->sa_family) &&
|
|
|
+ uaddr->sa_family == AF_UNSPEC))
|
|
|
return -EOPNOTSUPP;
|
|
|
if (tp->fastopen_req)
|
|
|
return -EALREADY; /* Another Fast Open is in progress */
|
|
@@ -1108,7 +1111,7 @@ static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg,
|
|
|
}
|
|
|
}
|
|
|
flags = (msg->msg_flags & MSG_DONTWAIT) ? O_NONBLOCK : 0;
|
|
|
- err = __inet_stream_connect(sk->sk_socket, msg->msg_name,
|
|
|
+ err = __inet_stream_connect(sk->sk_socket, uaddr,
|
|
|
msg->msg_namelen, flags, 1);
|
|
|
/* fastopen_req could already be freed in __inet_stream_connect
|
|
|
* if the connection times out or gets rst
|