aboutsummaryrefslogtreecommitdiffstats
path: root/net/unix
diff options
context:
space:
mode:
Diffstat (limited to 'net/unix')
-rw-r--r--net/unix/af_unix.c17
-rw-r--r--net/unix/sysctl_net_unix.c7
2 files changed, 13 insertions, 11 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
624static int unix_create(struct net *net, struct socket *sock, int protocol) 624static 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
2217static struct net_proto_family unix_family_ops = { 2220static 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,
diff --git a/net/unix/sysctl_net_unix.c b/net/unix/sysctl_net_unix.c
index 83c093077ebc..708f5df6b7f0 100644
--- a/net/unix/sysctl_net_unix.c
+++ b/net/unix/sysctl_net_unix.c
@@ -16,19 +16,18 @@
16 16
17static ctl_table unix_table[] = { 17static ctl_table unix_table[] = {
18 { 18 {
19 .ctl_name = NET_UNIX_MAX_DGRAM_QLEN,
20 .procname = "max_dgram_qlen", 19 .procname = "max_dgram_qlen",
21 .data = &init_net.unx.sysctl_max_dgram_qlen, 20 .data = &init_net.unx.sysctl_max_dgram_qlen,
22 .maxlen = sizeof(int), 21 .maxlen = sizeof(int),
23 .mode = 0644, 22 .mode = 0644,
24 .proc_handler = proc_dointvec 23 .proc_handler = proc_dointvec
25 }, 24 },
26 { .ctl_name = 0 } 25 { }
27}; 26};
28 27
29static struct ctl_path unix_path[] = { 28static struct ctl_path unix_path[] = {
30 { .procname = "net", .ctl_name = CTL_NET, }, 29 { .procname = "net", },
31 { .procname = "unix", .ctl_name = NET_UNIX, }, 30 { .procname = "unix", },
32 { }, 31 { },
33}; 32};
34 33