|
@@ -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);
|