diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 16 | 
1 files changed, 15 insertions, 1 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 3a43a830476..b1d75beb7e2 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -524,6 +524,8 @@ static int unix_dgram_connect(struct socket *, struct sockaddr *,  			      int, int);  static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *,  				  struct msghdr *, size_t); +static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *, +				  struct msghdr *, size_t, int);  static const struct proto_ops unix_stream_ops = {  	.family =	PF_UNIX, @@ -583,7 +585,7 @@ static const struct proto_ops unix_seqpacket_ops = {  	.setsockopt =	sock_no_setsockopt,  	.getsockopt =	sock_no_getsockopt,  	.sendmsg =	unix_seqpacket_sendmsg, -	.recvmsg =	unix_dgram_recvmsg, +	.recvmsg =	unix_seqpacket_recvmsg,  	.mmap =		sock_no_mmap,  	.sendpage =	sock_no_sendpage,  }; @@ -1699,6 +1701,18 @@ static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock,  	return unix_dgram_sendmsg(kiocb, sock, msg, len);  } +static int unix_seqpacket_recvmsg(struct kiocb *iocb, struct socket *sock, +			      struct msghdr *msg, size_t size, +			      int flags) +{ +	struct sock *sk = sock->sk; + +	if (sk->sk_state != TCP_ESTABLISHED) +		return -ENOTCONN; + +	return unix_dgram_recvmsg(iocb, sock, msg, size, flags); +} +  static void unix_copy_addr(struct msghdr *msg, struct sock *sk)  {  	struct unix_sock *u = unix_sk(sk);  | 
