diff options
Diffstat (limited to 'net/unix/af_unix.c')
-rw-r--r-- | net/unix/af_unix.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 86de99ad2976..a427623ee574 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -530,13 +530,17 @@ static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *, | |||
530 | static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *, | 530 | static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *, |
531 | struct msghdr *, size_t, int); | 531 | struct msghdr *, size_t, int); |
532 | 532 | ||
533 | static void unix_set_peek_off(struct sock *sk, int val) | 533 | static int unix_set_peek_off(struct sock *sk, int val) |
534 | { | 534 | { |
535 | struct unix_sock *u = unix_sk(sk); | 535 | struct unix_sock *u = unix_sk(sk); |
536 | 536 | ||
537 | mutex_lock(&u->readlock); | 537 | if (mutex_lock_interruptible(&u->readlock)) |
538 | return -EINTR; | ||
539 | |||
538 | sk->sk_peek_off = val; | 540 | sk->sk_peek_off = val; |
539 | mutex_unlock(&u->readlock); | 541 | mutex_unlock(&u->readlock); |
542 | |||
543 | return 0; | ||
540 | } | 544 | } |
541 | 545 | ||
542 | 546 | ||
@@ -714,7 +718,9 @@ static int unix_autobind(struct socket *sock) | |||
714 | int err; | 718 | int err; |
715 | unsigned int retries = 0; | 719 | unsigned int retries = 0; |
716 | 720 | ||
717 | mutex_lock(&u->readlock); | 721 | err = mutex_lock_interruptible(&u->readlock); |
722 | if (err) | ||
723 | return err; | ||
718 | 724 | ||
719 | err = 0; | 725 | err = 0; |
720 | if (u->addr) | 726 | if (u->addr) |
@@ -873,7 +879,9 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
873 | goto out; | 879 | goto out; |
874 | addr_len = err; | 880 | addr_len = err; |
875 | 881 | ||
876 | mutex_lock(&u->readlock); | 882 | err = mutex_lock_interruptible(&u->readlock); |
883 | if (err) | ||
884 | goto out; | ||
877 | 885 | ||
878 | err = -EINVAL; | 886 | err = -EINVAL; |
879 | if (u->addr) | 887 | if (u->addr) |
@@ -1246,6 +1254,15 @@ static int unix_socketpair(struct socket *socka, struct socket *sockb) | |||
1246 | return 0; | 1254 | return 0; |
1247 | } | 1255 | } |
1248 | 1256 | ||
1257 | static void unix_sock_inherit_flags(const struct socket *old, | ||
1258 | struct socket *new) | ||
1259 | { | ||
1260 | if (test_bit(SOCK_PASSCRED, &old->flags)) | ||
1261 | set_bit(SOCK_PASSCRED, &new->flags); | ||
1262 | if (test_bit(SOCK_PASSSEC, &old->flags)) | ||
1263 | set_bit(SOCK_PASSSEC, &new->flags); | ||
1264 | } | ||
1265 | |||
1249 | static int unix_accept(struct socket *sock, struct socket *newsock, int flags) | 1266 | static int unix_accept(struct socket *sock, struct socket *newsock, int flags) |
1250 | { | 1267 | { |
1251 | struct sock *sk = sock->sk; | 1268 | struct sock *sk = sock->sk; |
@@ -1280,6 +1297,7 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1280 | /* attach accepted sock to socket */ | 1297 | /* attach accepted sock to socket */ |
1281 | unix_state_lock(tsk); | 1298 | unix_state_lock(tsk); |
1282 | newsock->state = SS_CONNECTED; | 1299 | newsock->state = SS_CONNECTED; |
1300 | unix_sock_inherit_flags(sock, newsock); | ||
1283 | sock_graft(tsk, newsock); | 1301 | sock_graft(tsk, newsock); |
1284 | unix_state_unlock(tsk); | 1302 | unix_state_unlock(tsk); |
1285 | return 0; | 1303 | return 0; |
@@ -1744,7 +1762,6 @@ static void unix_copy_addr(struct msghdr *msg, struct sock *sk) | |||
1744 | { | 1762 | { |
1745 | struct unix_sock *u = unix_sk(sk); | 1763 | struct unix_sock *u = unix_sk(sk); |
1746 | 1764 | ||
1747 | msg->msg_namelen = 0; | ||
1748 | if (u->addr) { | 1765 | if (u->addr) { |
1749 | msg->msg_namelen = u->addr->len; | 1766 | msg->msg_namelen = u->addr->len; |
1750 | memcpy(msg->msg_name, u->addr->name, u->addr->len); | 1767 | memcpy(msg->msg_name, u->addr->name, u->addr->len); |
@@ -1768,8 +1785,6 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1768 | if (flags&MSG_OOB) | 1785 | if (flags&MSG_OOB) |
1769 | goto out; | 1786 | goto out; |
1770 | 1787 | ||
1771 | msg->msg_namelen = 0; | ||
1772 | |||
1773 | err = mutex_lock_interruptible(&u->readlock); | 1788 | err = mutex_lock_interruptible(&u->readlock); |
1774 | if (err) { | 1789 | if (err) { |
1775 | err = sock_intr_errno(sock_rcvtimeo(sk, noblock)); | 1790 | err = sock_intr_errno(sock_rcvtimeo(sk, noblock)); |
@@ -1914,8 +1929,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1914 | target = sock_rcvlowat(sk, flags&MSG_WAITALL, size); | 1929 | target = sock_rcvlowat(sk, flags&MSG_WAITALL, size); |
1915 | timeo = sock_rcvtimeo(sk, flags&MSG_DONTWAIT); | 1930 | timeo = sock_rcvtimeo(sk, flags&MSG_DONTWAIT); |
1916 | 1931 | ||
1917 | msg->msg_namelen = 0; | ||
1918 | |||
1919 | /* Lock the socket to prevent queue disordering | 1932 | /* Lock the socket to prevent queue disordering |
1920 | * while sleeps in memcpy_tomsg | 1933 | * while sleeps in memcpy_tomsg |
1921 | */ | 1934 | */ |