diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index dd419d286204..437a99e560e1 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1724,7 +1724,11 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,  	msg->msg_namelen = 0; -	mutex_lock(&u->readlock); +	err = mutex_lock_interruptible(&u->readlock); +	if (err) { +		err = sock_intr_errno(sock_rcvtimeo(sk, noblock)); +		goto out; +	}  	skb = skb_recv_datagram(sk, flags, noblock, &err);  	if (!skb) { @@ -1864,7 +1868,11 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  		memset(&tmp_scm, 0, sizeof(tmp_scm));  	} -	mutex_lock(&u->readlock); +	err = mutex_lock_interruptible(&u->readlock); +	if (err) { +		err = sock_intr_errno(timeo); +		goto out; +	}  	do {  		int chunk; @@ -1895,11 +1903,12 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  			timeo = unix_stream_data_wait(sk, timeo); -			if (signal_pending(current)) { +			if (signal_pending(current) +			    ||  mutex_lock_interruptible(&u->readlock)) {  				err = sock_intr_errno(timeo);  				goto out;  			} -			mutex_lock(&u->readlock); +  			continue;   unlock:  			unix_state_unlock(sk);  | 
