diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 51ab497115eb..f25511903115 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -621,7 +621,8 @@ out: | |||
| 621 | return sk; | 621 | return sk; |
| 622 | } | 622 | } |
| 623 | 623 | ||
| 624 | static int unix_create(struct net *net, struct socket *sock, int protocol) | 624 | static int unix_create(struct net *net, struct socket *sock, int protocol, |
| 625 | int kern) | ||
| 625 | { | 626 | { |
| 626 | if (protocol && protocol != PF_UNIX) | 627 | if (protocol && protocol != PF_UNIX) |
| 627 | return -EPROTONOSUPPORT; | 628 | return -EPROTONOSUPPORT; |
| @@ -1032,8 +1033,8 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, | |||
| 1032 | goto out; | 1033 | goto out; |
| 1033 | addr_len = err; | 1034 | addr_len = err; |
| 1034 | 1035 | ||
| 1035 | if (test_bit(SOCK_PASSCRED, &sock->flags) | 1036 | if (test_bit(SOCK_PASSCRED, &sock->flags) && !u->addr && |
| 1036 | && !u->addr && (err = unix_autobind(sock)) != 0) | 1037 | (err = unix_autobind(sock)) != 0) |
| 1037 | goto out; | 1038 | goto out; |
| 1038 | 1039 | ||
| 1039 | timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); | 1040 | timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); |
| @@ -1074,6 +1075,8 @@ restart: | |||
| 1074 | err = -ECONNREFUSED; | 1075 | err = -ECONNREFUSED; |
| 1075 | if (other->sk_state != TCP_LISTEN) | 1076 | if (other->sk_state != TCP_LISTEN) |
| 1076 | goto out_unlock; | 1077 | goto out_unlock; |
| 1078 | if (other->sk_shutdown & RCV_SHUTDOWN) | ||
| 1079 | goto out_unlock; | ||
| 1077 | 1080 | ||
| 1078 | if (unix_recvq_full(other)) { | 1081 | if (unix_recvq_full(other)) { |
| 1079 | err = -EAGAIN; | 1082 | err = -EAGAIN; |
| @@ -1256,7 +1259,7 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_ | |||
| 1256 | { | 1259 | { |
| 1257 | struct sock *sk = sock->sk; | 1260 | struct sock *sk = sock->sk; |
| 1258 | struct unix_sock *u; | 1261 | struct unix_sock *u; |
| 1259 | struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr; | 1262 | DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, uaddr); |
| 1260 | int err = 0; | 1263 | int err = 0; |
| 1261 | 1264 | ||
| 1262 | if (peer) { | 1265 | if (peer) { |
| @@ -1375,8 +1378,8 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
| 1375 | goto out; | 1378 | goto out; |
| 1376 | } | 1379 | } |
| 1377 | 1380 | ||
| 1378 | if (test_bit(SOCK_PASSCRED, &sock->flags) | 1381 | if (test_bit(SOCK_PASSCRED, &sock->flags) && !u->addr |
| 1379 | && !u->addr && (err = unix_autobind(sock)) != 0) | 1382 | && (err = unix_autobind(sock)) != 0) |
| 1380 | goto out; | 1383 | goto out; |
| 1381 | 1384 | ||
| 1382 | err = -EMSGSIZE; | 1385 | err = -EMSGSIZE; |
| @@ -2214,7 +2217,7 @@ static const struct file_operations unix_seq_fops = { | |||
| 2214 | 2217 | ||
| 2215 | #endif | 2218 | #endif |
| 2216 | 2219 | ||
| 2217 | static struct net_proto_family unix_family_ops = { | 2220 | static const struct net_proto_family unix_family_ops = { |
| 2218 | .family = PF_UNIX, | 2221 | .family = PF_UNIX, |
| 2219 | .create = unix_create, | 2222 | .create = unix_create, |
| 2220 | .owner = THIS_MODULE, | 2223 | .owner = THIS_MODULE, |
