blob: e7012a509035223688acbecc9b71f8212e54ac9f [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * NET4: Implementation of BSD Unix domain sockets.
3 *
Alan Cox113aa832008-10-13 19:01:08 -07004 * Authors: Alan Cox, <alan@lxorguk.ukuu.org.uk>
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070011 * Fixes:
12 * Linus Torvalds : Assorted bug cures.
13 * Niibe Yutaka : async I/O support.
14 * Carsten Paeth : PF_UNIX check, address fixes.
15 * Alan Cox : Limit size of allocated blocks.
16 * Alan Cox : Fixed the stupid socketpair bug.
17 * Alan Cox : BSD compatibility fine tuning.
18 * Alan Cox : Fixed a bug in connect when interrupted.
19 * Alan Cox : Sorted out a proper draft version of
20 * file descriptor passing hacked up from
21 * Mike Shaver's work.
22 * Marty Leisner : Fixes to fd passing
23 * Nick Nevin : recvmsg bugfix.
24 * Alan Cox : Started proper garbage collector
25 * Heiko EiBfeldt : Missing verify_area check
26 * Alan Cox : Started POSIXisms
27 * Andreas Schwab : Replace inode by dentry for proper
28 * reference counting
29 * Kirk Petersen : Made this a module
30 * Christoph Rohland : Elegant non-blocking accept/connect algorithm.
31 * Lots of bug fixes.
32 * Alexey Kuznetosv : Repaired (I hope) bugs introduces
33 * by above two patches.
34 * Andrea Arcangeli : If possible we block in connect(2)
35 * if the max backlog of the listen socket
36 * is been reached. This won't break
37 * old apps and it will avoid huge amount
38 * of socks hashed (this for unix_gc()
39 * performances reasons).
40 * Security fix that limits the max
41 * number of socks to 2*max_files and
42 * the number of skb queueable in the
43 * dgram receiver.
44 * Artur Skawina : Hash function optimizations
45 * Alexey Kuznetsov : Full scale SMP. Lot of bugs are introduced 8)
46 * Malcolm Beattie : Set peercred for socketpair
47 * Michal Ostrowski : Module initialization cleanup.
48 * Arnaldo C. Melo : Remove MOD_{INC,DEC}_USE_COUNT,
49 * the core infrastructure is doing that
50 * for all net proto families now (2.5.69+)
51 *
52 *
53 * Known differences from reference BSD that was tested:
54 *
55 * [TO FIX]
56 * ECONNREFUSED is not returned from one end of a connected() socket to the
57 * other the moment one end closes.
58 * fstat() doesn't return st_dev=0, and give the blksize as high water mark
59 * and a fake inode identifier (nor the BSD first socket fstat twice bug).
60 * [NOT TO FIX]
61 * accept() returns a path name even if the connecting socket has closed
62 * in the meantime (BSD loses the path and gives up).
63 * accept() returns 0 length path for an unbound connector. BSD returns 16
64 * and a null first byte in the path (but not for gethost/peername - BSD bug ??)
65 * socketpair(...SOCK_RAW..) doesn't panic the kernel.
66 * BSD af_unix apparently has connect forgetting to block properly.
67 * (need to check this with the POSIX spec in detail)
68 *
69 * Differences from 2.0.0-11-... (ANK)
70 * Bug fixes and improvements.
71 * - client shutdown killed server socket.
72 * - removed all useless cli/sti pairs.
73 *
74 * Semantic changes/extensions.
75 * - generic control message passing.
76 * - SCM_CREDENTIALS control message.
77 * - "Abstract" (not FS based) socket bindings.
78 * Abstract names are sequences of bytes (not zero terminated)
79 * started by 0, so that this name space does not intersect
80 * with BSD names.
81 */
82
wangweidong5cc208b2013-12-06 18:03:36 +080083#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
84
Linus Torvalds1da177e2005-04-16 15:20:36 -070085#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070086#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070087#include <linux/signal.h>
88#include <linux/sched.h>
89#include <linux/errno.h>
90#include <linux/string.h>
91#include <linux/stat.h>
92#include <linux/dcache.h>
93#include <linux/namei.h>
94#include <linux/socket.h>
95#include <linux/un.h>
96#include <linux/fcntl.h>
97#include <linux/termios.h>
98#include <linux/sockios.h>
99#include <linux/net.h>
100#include <linux/in.h>
101#include <linux/fs.h>
102#include <linux/slab.h>
103#include <asm/uaccess.h>
104#include <linux/skbuff.h>
105#include <linux/netdevice.h>
Eric W. Biederman457c4cb2007-09-12 12:01:34 +0200106#include <net/net_namespace.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107#include <net/sock.h>
Arnaldo Carvalho de Meloc752f072005-08-09 20:08:28 -0700108#include <net/tcp_states.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109#include <net/af_unix.h>
110#include <linux/proc_fs.h>
111#include <linux/seq_file.h>
112#include <net/scm.h>
113#include <linux/init.h>
114#include <linux/poll.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115#include <linux/rtnetlink.h>
116#include <linux/mount.h>
117#include <net/checksum.h>
118#include <linux/security.h>
Colin Cross2b15af62013-05-06 23:50:21 +0000119#include <linux/freezer.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120
Eric Dumazet7123aaa2012-06-08 05:03:21 +0000121struct hlist_head unix_socket_table[2 * UNIX_HASH_SIZE];
Pavel Emelyanovfa7ff562011-12-15 02:44:03 +0000122EXPORT_SYMBOL_GPL(unix_socket_table);
123DEFINE_SPINLOCK(unix_table_lock);
124EXPORT_SYMBOL_GPL(unix_table_lock);
Eric Dumazet518de9b2010-10-26 14:22:44 -0700125static atomic_long_t unix_nr_socks;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127
Eric Dumazet7123aaa2012-06-08 05:03:21 +0000128static struct hlist_head *unix_sockets_unbound(void *addr)
129{
130 unsigned long hash = (unsigned long)addr;
131
132 hash ^= hash >> 16;
133 hash ^= hash >> 8;
134 hash %= UNIX_HASH_SIZE;
135 return &unix_socket_table[UNIX_HASH_SIZE + hash];
136}
137
138#define UNIX_ABSTRACT(sk) (unix_sk(sk)->addr->hash < UNIX_HASH_SIZE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700140#ifdef CONFIG_SECURITY_NETWORK
Catherine Zhangdc49c1f2006-08-02 14:12:06 -0700141static void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb)
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700142{
Stephen Smalley37a9a8d2015-06-10 08:44:59 -0400143 UNIXCB(skb).secid = scm->secid;
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700144}
145
146static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb)
147{
Stephen Smalley37a9a8d2015-06-10 08:44:59 -0400148 scm->secid = UNIXCB(skb).secid;
149}
150
151static inline bool unix_secdata_eq(struct scm_cookie *scm, struct sk_buff *skb)
152{
153 return (scm->secid == UNIXCB(skb).secid);
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700154}
155#else
Catherine Zhangdc49c1f2006-08-02 14:12:06 -0700156static inline void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb)
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700157{ }
158
159static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb)
160{ }
Stephen Smalley37a9a8d2015-06-10 08:44:59 -0400161
162static inline bool unix_secdata_eq(struct scm_cookie *scm, struct sk_buff *skb)
163{
164 return true;
165}
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700166#endif /* CONFIG_SECURITY_NETWORK */
167
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168/*
169 * SMP locking strategy:
David S. Millerfbe9cc42005-12-13 23:26:29 -0800170 * hash table is protected with spinlock unix_table_lock
Stephen Hemminger663717f2010-02-18 14:12:06 -0800171 * each socket state is protected by separate spin lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172 */
173
Eric Dumazet95c96172012-04-15 05:58:06 +0000174static inline unsigned int unix_hash_fold(__wsum n)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175{
Anton Blanchard0a134042014-03-05 14:29:58 +1100176 unsigned int hash = (__force unsigned int)csum_fold(n);
Eric Dumazet95c96172012-04-15 05:58:06 +0000177
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178 hash ^= hash>>8;
179 return hash&(UNIX_HASH_SIZE-1);
180}
181
182#define unix_peer(sk) (unix_sk(sk)->peer)
183
184static inline int unix_our_peer(struct sock *sk, struct sock *osk)
185{
186 return unix_peer(osk) == sk;
187}
188
189static inline int unix_may_send(struct sock *sk, struct sock *osk)
190{
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800191 return unix_peer(osk) == NULL || unix_our_peer(sk, osk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192}
193
Rainer Weikusat3c734192008-06-17 22:28:05 -0700194static inline int unix_recvq_full(struct sock const *sk)
195{
196 return skb_queue_len(&sk->sk_receive_queue) > sk->sk_max_ack_backlog;
197}
198
Pavel Emelyanovfa7ff562011-12-15 02:44:03 +0000199struct sock *unix_peer_get(struct sock *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200{
201 struct sock *peer;
202
David S. Miller1c92b4e2007-05-31 13:24:26 -0700203 unix_state_lock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204 peer = unix_peer(s);
205 if (peer)
206 sock_hold(peer);
David S. Miller1c92b4e2007-05-31 13:24:26 -0700207 unix_state_unlock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208 return peer;
209}
Pavel Emelyanovfa7ff562011-12-15 02:44:03 +0000210EXPORT_SYMBOL_GPL(unix_peer_get);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211
212static inline void unix_release_addr(struct unix_address *addr)
213{
214 if (atomic_dec_and_test(&addr->refcnt))
215 kfree(addr);
216}
217
218/*
219 * Check unix socket name:
220 * - should be not zero length.
221 * - if started by not zero, should be NULL terminated (FS object)
222 * - if started by zero, it is abstract name.
223 */
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +0900224
Eric Dumazet95c96172012-04-15 05:58:06 +0000225static int unix_mkname(struct sockaddr_un *sunaddr, int len, unsigned int *hashp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226{
Kyeongdon Kim03a94d72018-10-16 14:57:26 +0900227 *hashp = 0;
228
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229 if (len <= sizeof(short) || len > sizeof(*sunaddr))
230 return -EINVAL;
231 if (!sunaddr || sunaddr->sun_family != AF_UNIX)
232 return -EINVAL;
233 if (sunaddr->sun_path[0]) {
234 /*
235 * This may look like an off by one error but it is a bit more
236 * subtle. 108 is the longest valid AF_UNIX path for a binding.
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300237 * sun_path[108] doesn't as such exist. However in kernel space
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238 * we are guaranteed that it is a valid memory location in our
239 * kernel address buffer.
240 */
Jianjun Konge27dfce2008-11-01 21:38:31 -0700241 ((char *)sunaddr)[len] = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242 len = strlen(sunaddr->sun_path)+1+sizeof(short);
243 return len;
244 }
245
Joe Perches07f07572008-11-19 15:44:53 -0800246 *hashp = unix_hash_fold(csum_partial(sunaddr, len, 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247 return len;
248}
249
250static void __unix_remove_socket(struct sock *sk)
251{
252 sk_del_node_init(sk);
253}
254
255static void __unix_insert_socket(struct hlist_head *list, struct sock *sk)
256{
Ilpo Järvinen547b7922008-07-25 21:43:18 -0700257 WARN_ON(!sk_unhashed(sk));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700258 sk_add_node(sk, list);
259}
260
261static inline void unix_remove_socket(struct sock *sk)
262{
David S. Millerfbe9cc42005-12-13 23:26:29 -0800263 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264 __unix_remove_socket(sk);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800265 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700266}
267
268static inline void unix_insert_socket(struct hlist_head *list, struct sock *sk)
269{
David S. Millerfbe9cc42005-12-13 23:26:29 -0800270 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271 __unix_insert_socket(list, sk);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800272 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273}
274
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800275static struct sock *__unix_find_socket_byname(struct net *net,
276 struct sockaddr_un *sunname,
Eric Dumazet95c96172012-04-15 05:58:06 +0000277 int len, int type, unsigned int hash)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278{
279 struct sock *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280
Sasha Levinb67bfe02013-02-27 17:06:00 -0800281 sk_for_each(s, &unix_socket_table[hash ^ type]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700282 struct unix_sock *u = unix_sk(s);
283
YOSHIFUJI Hideaki878628f2008-03-26 03:57:35 +0900284 if (!net_eq(sock_net(s), net))
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800285 continue;
286
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 if (u->addr->len == len &&
288 !memcmp(u->addr->name, sunname, len))
289 goto found;
290 }
291 s = NULL;
292found:
293 return s;
294}
295
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800296static inline struct sock *unix_find_socket_byname(struct net *net,
297 struct sockaddr_un *sunname,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298 int len, int type,
Eric Dumazet95c96172012-04-15 05:58:06 +0000299 unsigned int hash)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300{
301 struct sock *s;
302
David S. Millerfbe9cc42005-12-13 23:26:29 -0800303 spin_lock(&unix_table_lock);
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800304 s = __unix_find_socket_byname(net, sunname, len, type, hash);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305 if (s)
306 sock_hold(s);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800307 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308 return s;
309}
310
Eric W. Biederman6616f782010-06-13 03:35:48 +0000311static struct sock *unix_find_socket_byinode(struct inode *i)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312{
313 struct sock *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314
David S. Millerfbe9cc42005-12-13 23:26:29 -0800315 spin_lock(&unix_table_lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -0800316 sk_for_each(s,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317 &unix_socket_table[i->i_ino & (UNIX_HASH_SIZE - 1)]) {
Al Viro40ffe672012-03-14 21:54:32 -0400318 struct dentry *dentry = unix_sk(s)->path.dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319
Miklos Szeredieb0a4a42016-05-20 22:13:45 +0200320 if (dentry && d_real_inode(dentry) == i) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700321 sock_hold(s);
322 goto found;
323 }
324 }
325 s = NULL;
326found:
David S. Millerfbe9cc42005-12-13 23:26:29 -0800327 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328 return s;
329}
330
Rainer Weikusat7d267272015-11-20 22:07:23 +0000331/* Support code for asymmetrically connected dgram sockets
332 *
333 * If a datagram socket is connected to a socket not itself connected
334 * to the first socket (eg, /dev/log), clients may only enqueue more
335 * messages if the present receive queue of the server socket is not
336 * "too large". This means there's a second writeability condition
337 * poll and sendmsg need to test. The dgram recv code will do a wake
338 * up on the peer_wait wait queue of a socket upon reception of a
339 * datagram which needs to be propagated to sleeping would-be writers
340 * since these might not have sent anything so far. This can't be
341 * accomplished via poll_wait because the lifetime of the server
342 * socket might be less than that of its clients if these break their
343 * association with it or if the server socket is closed while clients
344 * are still connected to it and there's no way to inform "a polling
345 * implementation" that it should let go of a certain wait queue
346 *
347 * In order to propagate a wake up, a wait_queue_t of the client
348 * socket is enqueued on the peer_wait queue of the server socket
349 * whose wake function does a wake_up on the ordinary client socket
350 * wait queue. This connection is established whenever a write (or
351 * poll for write) hit the flow control condition and broken when the
352 * association to the server socket is dissolved or after a wake up
353 * was relayed.
354 */
355
356static int unix_dgram_peer_wake_relay(wait_queue_t *q, unsigned mode, int flags,
357 void *key)
358{
359 struct unix_sock *u;
360 wait_queue_head_t *u_sleep;
361
362 u = container_of(q, struct unix_sock, peer_wake);
363
364 __remove_wait_queue(&unix_sk(u->peer_wake.private)->peer_wait,
365 q);
366 u->peer_wake.private = NULL;
367
368 /* relaying can only happen while the wq still exists */
369 u_sleep = sk_sleep(&u->sk);
370 if (u_sleep)
371 wake_up_interruptible_poll(u_sleep, key);
372
373 return 0;
374}
375
376static int unix_dgram_peer_wake_connect(struct sock *sk, struct sock *other)
377{
378 struct unix_sock *u, *u_other;
379 int rc;
380
381 u = unix_sk(sk);
382 u_other = unix_sk(other);
383 rc = 0;
384 spin_lock(&u_other->peer_wait.lock);
385
386 if (!u->peer_wake.private) {
387 u->peer_wake.private = other;
388 __add_wait_queue(&u_other->peer_wait, &u->peer_wake);
389
390 rc = 1;
391 }
392
393 spin_unlock(&u_other->peer_wait.lock);
394 return rc;
395}
396
397static void unix_dgram_peer_wake_disconnect(struct sock *sk,
398 struct sock *other)
399{
400 struct unix_sock *u, *u_other;
401
402 u = unix_sk(sk);
403 u_other = unix_sk(other);
404 spin_lock(&u_other->peer_wait.lock);
405
406 if (u->peer_wake.private == other) {
407 __remove_wait_queue(&u_other->peer_wait, &u->peer_wake);
408 u->peer_wake.private = NULL;
409 }
410
411 spin_unlock(&u_other->peer_wait.lock);
412}
413
414static void unix_dgram_peer_wake_disconnect_wakeup(struct sock *sk,
415 struct sock *other)
416{
417 unix_dgram_peer_wake_disconnect(sk, other);
418 wake_up_interruptible_poll(sk_sleep(sk),
419 POLLOUT |
420 POLLWRNORM |
421 POLLWRBAND);
422}
423
424/* preconditions:
425 * - unix_peer(sk) == other
426 * - association is stable
427 */
428static int unix_dgram_peer_wake_me(struct sock *sk, struct sock *other)
429{
430 int connected;
431
432 connected = unix_dgram_peer_wake_connect(sk, other);
433
434 if (unix_recvq_full(other))
435 return 1;
436
437 if (connected)
438 unix_dgram_peer_wake_disconnect(sk, other);
439
440 return 0;
441}
442
Eric Dumazet1586a582015-10-23 10:59:16 -0700443static int unix_writable(const struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444{
Eric Dumazet1586a582015-10-23 10:59:16 -0700445 return sk->sk_state != TCP_LISTEN &&
446 (atomic_read(&sk->sk_wmem_alloc) << 2) <= sk->sk_sndbuf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447}
448
449static void unix_write_space(struct sock *sk)
450{
Eric Dumazet43815482010-04-29 11:01:49 +0000451 struct socket_wq *wq;
452
453 rcu_read_lock();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 if (unix_writable(sk)) {
Eric Dumazet43815482010-04-29 11:01:49 +0000455 wq = rcu_dereference(sk->sk_wq);
Herbert Xu1ce0bf52015-11-26 13:55:39 +0800456 if (skwq_has_sleeper(wq))
Eric Dumazet67426b72010-10-29 20:44:44 +0000457 wake_up_interruptible_sync_poll(&wq->wait,
458 POLLOUT | POLLWRNORM | POLLWRBAND);
Pavel Emelyanov8d8ad9d2007-11-26 20:10:50 +0800459 sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460 }
Eric Dumazet43815482010-04-29 11:01:49 +0000461 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462}
463
464/* When dgram socket disconnects (or changes its peer), we clear its receive
465 * queue of packets arrived from previous peer. First, it allows to do
466 * flow control based only on wmem_alloc; second, sk connected to peer
467 * may receive messages only from that peer. */
468static void unix_dgram_disconnected(struct sock *sk, struct sock *other)
469{
David S. Millerb03efcf2005-07-08 14:57:23 -0700470 if (!skb_queue_empty(&sk->sk_receive_queue)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700471 skb_queue_purge(&sk->sk_receive_queue);
472 wake_up_interruptible_all(&unix_sk(sk)->peer_wait);
473
474 /* If one link of bidirectional dgram pipe is disconnected,
475 * we signal error. Messages are lost. Do not make this,
476 * when peer was not connected to us.
477 */
478 if (!sock_flag(other, SOCK_DEAD) && unix_peer(other) == sk) {
479 other->sk_err = ECONNRESET;
480 other->sk_error_report(other);
481 }
482 }
483}
484
485static void unix_sock_destructor(struct sock *sk)
486{
487 struct unix_sock *u = unix_sk(sk);
488
489 skb_queue_purge(&sk->sk_receive_queue);
490
Ilpo Järvinen547b7922008-07-25 21:43:18 -0700491 WARN_ON(atomic_read(&sk->sk_wmem_alloc));
492 WARN_ON(!sk_unhashed(sk));
493 WARN_ON(sk->sk_socket);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 if (!sock_flag(sk, SOCK_DEAD)) {
wangweidong5cc208b2013-12-06 18:03:36 +0800495 pr_info("Attempt to release alive unix socket: %p\n", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700496 return;
497 }
498
499 if (u->addr)
500 unix_release_addr(u->addr);
501
Eric Dumazet518de9b2010-10-26 14:22:44 -0700502 atomic_long_dec(&unix_nr_socks);
David S. Miller6f756a82008-11-23 17:34:03 -0800503 local_bh_disable();
Eric Dumazeta8076d82008-11-17 02:38:49 -0800504 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
David S. Miller6f756a82008-11-23 17:34:03 -0800505 local_bh_enable();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506#ifdef UNIX_REFCNT_DEBUG
wangweidong5cc208b2013-12-06 18:03:36 +0800507 pr_debug("UNIX %p is destroyed, %ld are still alive.\n", sk,
Eric Dumazet518de9b2010-10-26 14:22:44 -0700508 atomic_long_read(&unix_nr_socks));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509#endif
510}
511
Paul Mooreded34e02013-03-25 03:18:33 +0000512static void unix_release_sock(struct sock *sk, int embrion)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513{
514 struct unix_sock *u = unix_sk(sk);
Al Viro40ffe672012-03-14 21:54:32 -0400515 struct path path;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700516 struct sock *skpair;
517 struct sk_buff *skb;
518 int state;
519
520 unix_remove_socket(sk);
521
522 /* Clear state */
David S. Miller1c92b4e2007-05-31 13:24:26 -0700523 unix_state_lock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700524 sock_orphan(sk);
525 sk->sk_shutdown = SHUTDOWN_MASK;
Al Viro40ffe672012-03-14 21:54:32 -0400526 path = u->path;
527 u->path.dentry = NULL;
528 u->path.mnt = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 state = sk->sk_state;
530 sk->sk_state = TCP_CLOSE;
David S. Miller1c92b4e2007-05-31 13:24:26 -0700531 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532
533 wake_up_interruptible_all(&u->peer_wait);
534
Jianjun Konge27dfce2008-11-01 21:38:31 -0700535 skpair = unix_peer(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536
Jianjun Konge27dfce2008-11-01 21:38:31 -0700537 if (skpair != NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538 if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) {
David S. Miller1c92b4e2007-05-31 13:24:26 -0700539 unix_state_lock(skpair);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540 /* No more writes */
541 skpair->sk_shutdown = SHUTDOWN_MASK;
542 if (!skb_queue_empty(&sk->sk_receive_queue) || embrion)
543 skpair->sk_err = ECONNRESET;
David S. Miller1c92b4e2007-05-31 13:24:26 -0700544 unix_state_unlock(skpair);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545 skpair->sk_state_change(skpair);
Pavel Emelyanov8d8ad9d2007-11-26 20:10:50 +0800546 sk_wake_async(skpair, SOCK_WAKE_WAITD, POLL_HUP);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 }
Rainer Weikusat7d267272015-11-20 22:07:23 +0000548
549 unix_dgram_peer_wake_disconnect(sk, skpair);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 sock_put(skpair); /* It may now die */
551 unix_peer(sk) = NULL;
552 }
553
554 /* Try to flush out this socket. Throw out buffers at least */
555
556 while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
Jianjun Konge27dfce2008-11-01 21:38:31 -0700557 if (state == TCP_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558 unix_release_sock(skb->sk, 1);
559 /* passed fds are erased in the kfree_skb hook */
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +0100560 UNIXCB(skb).consumed = skb->len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561 kfree_skb(skb);
562 }
563
Al Viro40ffe672012-03-14 21:54:32 -0400564 if (path.dentry)
565 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566
567 sock_put(sk);
568
569 /* ---- Socket is dead now and most probably destroyed ---- */
570
571 /*
Alan Coxe04dae82012-09-17 00:52:41 +0000572 * Fixme: BSD difference: In BSD all sockets connected to us get
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573 * ECONNRESET and we die on the spot. In Linux we behave
574 * like files and pipes do and wait for the last
575 * dereference.
576 *
577 * Can't we simply set sock->err?
578 *
579 * What the above comment does talk about? --ANK(980817)
580 */
581
Pavel Emelyanov9305cfa2007-11-10 22:06:01 -0800582 if (unix_tot_inflight)
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +0900583 unix_gc(); /* Garbage collect fds */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700584}
585
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000586static void init_peercred(struct sock *sk)
587{
588 put_pid(sk->sk_peer_pid);
589 if (sk->sk_peer_cred)
590 put_cred(sk->sk_peer_cred);
591 sk->sk_peer_pid = get_pid(task_tgid(current));
592 sk->sk_peer_cred = get_current_cred();
593}
594
595static void copy_peercred(struct sock *sk, struct sock *peersk)
596{
597 put_pid(sk->sk_peer_pid);
598 if (sk->sk_peer_cred)
599 put_cred(sk->sk_peer_cred);
600 sk->sk_peer_pid = get_pid(peersk->sk_peer_pid);
601 sk->sk_peer_cred = get_cred(peersk->sk_peer_cred);
602}
603
Linus Torvalds1da177e2005-04-16 15:20:36 -0700604static int unix_listen(struct socket *sock, int backlog)
605{
606 int err;
607 struct sock *sk = sock->sk;
608 struct unix_sock *u = unix_sk(sk);
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000609 struct pid *old_pid = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610
611 err = -EOPNOTSUPP;
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800612 if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
613 goto out; /* Only stream/seqpacket sockets accept */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 err = -EINVAL;
615 if (!u->addr)
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800616 goto out; /* No listens on an unbound socket */
David S. Miller1c92b4e2007-05-31 13:24:26 -0700617 unix_state_lock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618 if (sk->sk_state != TCP_CLOSE && sk->sk_state != TCP_LISTEN)
619 goto out_unlock;
620 if (backlog > sk->sk_max_ack_backlog)
621 wake_up_interruptible_all(&u->peer_wait);
622 sk->sk_max_ack_backlog = backlog;
623 sk->sk_state = TCP_LISTEN;
624 /* set credentials so connect can copy them */
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000625 init_peercred(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626 err = 0;
627
628out_unlock:
David S. Miller1c92b4e2007-05-31 13:24:26 -0700629 unix_state_unlock(sk);
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000630 put_pid(old_pid);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700631out:
632 return err;
633}
634
635static int unix_release(struct socket *);
636static int unix_bind(struct socket *, struct sockaddr *, int);
637static int unix_stream_connect(struct socket *, struct sockaddr *,
638 int addr_len, int flags);
639static int unix_socketpair(struct socket *, struct socket *);
640static int unix_accept(struct socket *, struct socket *, int);
641static int unix_getname(struct socket *, struct sockaddr *, int *, int);
642static unsigned int unix_poll(struct file *, struct socket *, poll_table *);
Rainer Weikusatec0d2152008-06-27 19:34:18 -0700643static unsigned int unix_dgram_poll(struct file *, struct socket *,
644 poll_table *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700645static int unix_ioctl(struct socket *, unsigned int, unsigned long);
646static int unix_shutdown(struct socket *, int);
Ying Xue1b784142015-03-02 15:37:48 +0800647static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);
648static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, int);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +0200649static ssize_t unix_stream_sendpage(struct socket *, struct page *, int offset,
650 size_t size, int flags);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +0200651static ssize_t unix_stream_splice_read(struct socket *, loff_t *ppos,
652 struct pipe_inode_info *, size_t size,
653 unsigned int flags);
Ying Xue1b784142015-03-02 15:37:48 +0800654static int unix_dgram_sendmsg(struct socket *, struct msghdr *, size_t);
655static int unix_dgram_recvmsg(struct socket *, struct msghdr *, size_t, int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656static int unix_dgram_connect(struct socket *, struct sockaddr *,
657 int, int);
Ying Xue1b784142015-03-02 15:37:48 +0800658static int unix_seqpacket_sendmsg(struct socket *, struct msghdr *, size_t);
659static int unix_seqpacket_recvmsg(struct socket *, struct msghdr *, size_t,
660 int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661
Sasha Levin12663bf2013-12-07 17:26:27 -0500662static int unix_set_peek_off(struct sock *sk, int val)
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000663{
664 struct unix_sock *u = unix_sk(sk);
665
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700666 if (mutex_lock_interruptible(&u->iolock))
Sasha Levin12663bf2013-12-07 17:26:27 -0500667 return -EINTR;
668
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000669 sk->sk_peek_off = val;
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700670 mutex_unlock(&u->iolock);
Sasha Levin12663bf2013-12-07 17:26:27 -0500671
672 return 0;
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000673}
674
675
Eric Dumazet90ddc4f2005-12-22 12:49:22 -0800676static const struct proto_ops unix_stream_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 .family = PF_UNIX,
678 .owner = THIS_MODULE,
679 .release = unix_release,
680 .bind = unix_bind,
681 .connect = unix_stream_connect,
682 .socketpair = unix_socketpair,
683 .accept = unix_accept,
684 .getname = unix_getname,
685 .poll = unix_poll,
686 .ioctl = unix_ioctl,
687 .listen = unix_listen,
688 .shutdown = unix_shutdown,
689 .setsockopt = sock_no_setsockopt,
690 .getsockopt = sock_no_getsockopt,
691 .sendmsg = unix_stream_sendmsg,
692 .recvmsg = unix_stream_recvmsg,
693 .mmap = sock_no_mmap,
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +0200694 .sendpage = unix_stream_sendpage,
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +0200695 .splice_read = unix_stream_splice_read,
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +0000696 .set_peek_off = unix_set_peek_off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700697};
698
Eric Dumazet90ddc4f2005-12-22 12:49:22 -0800699static const struct proto_ops unix_dgram_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700 .family = PF_UNIX,
701 .owner = THIS_MODULE,
702 .release = unix_release,
703 .bind = unix_bind,
704 .connect = unix_dgram_connect,
705 .socketpair = unix_socketpair,
706 .accept = sock_no_accept,
707 .getname = unix_getname,
Rainer Weikusatec0d2152008-06-27 19:34:18 -0700708 .poll = unix_dgram_poll,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709 .ioctl = unix_ioctl,
710 .listen = sock_no_listen,
711 .shutdown = unix_shutdown,
712 .setsockopt = sock_no_setsockopt,
713 .getsockopt = sock_no_getsockopt,
714 .sendmsg = unix_dgram_sendmsg,
715 .recvmsg = unix_dgram_recvmsg,
716 .mmap = sock_no_mmap,
717 .sendpage = sock_no_sendpage,
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000718 .set_peek_off = unix_set_peek_off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719};
720
Eric Dumazet90ddc4f2005-12-22 12:49:22 -0800721static const struct proto_ops unix_seqpacket_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722 .family = PF_UNIX,
723 .owner = THIS_MODULE,
724 .release = unix_release,
725 .bind = unix_bind,
726 .connect = unix_stream_connect,
727 .socketpair = unix_socketpair,
728 .accept = unix_accept,
729 .getname = unix_getname,
Rainer Weikusatec0d2152008-06-27 19:34:18 -0700730 .poll = unix_dgram_poll,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700731 .ioctl = unix_ioctl,
732 .listen = unix_listen,
733 .shutdown = unix_shutdown,
734 .setsockopt = sock_no_setsockopt,
735 .getsockopt = sock_no_getsockopt,
736 .sendmsg = unix_seqpacket_sendmsg,
Eric W. Biedermana05d2ad2011-04-24 01:54:57 +0000737 .recvmsg = unix_seqpacket_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738 .mmap = sock_no_mmap,
739 .sendpage = sock_no_sendpage,
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000740 .set_peek_off = unix_set_peek_off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741};
742
743static struct proto unix_proto = {
Eric Dumazet248969a2008-11-17 00:00:30 -0800744 .name = "UNIX",
745 .owner = THIS_MODULE,
Eric Dumazet248969a2008-11-17 00:00:30 -0800746 .obj_size = sizeof(struct unix_sock),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747};
748
Ingo Molnara09785a2006-07-03 00:25:12 -0700749/*
750 * AF_UNIX sockets do not interact with hardware, hence they
751 * dont trigger interrupts - so it's safe for them to have
752 * bh-unsafe locking for their sk_receive_queue.lock. Split off
753 * this special lock-class by reinitializing the spinlock key:
754 */
755static struct lock_class_key af_unix_sk_receive_queue_lock_key;
756
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500757static struct sock *unix_create1(struct net *net, struct socket *sock, int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700758{
759 struct sock *sk = NULL;
760 struct unix_sock *u;
761
Eric Dumazet518de9b2010-10-26 14:22:44 -0700762 atomic_long_inc(&unix_nr_socks);
763 if (atomic_long_read(&unix_nr_socks) > 2 * get_max_files())
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764 goto out;
765
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500766 sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto, kern);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767 if (!sk)
768 goto out;
769
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800770 sock_init_data(sock, sk);
Ingo Molnara09785a2006-07-03 00:25:12 -0700771 lockdep_set_class(&sk->sk_receive_queue.lock,
772 &af_unix_sk_receive_queue_lock_key);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773
Vladimir Davydov3aa97992016-07-26 15:24:36 -0700774 sk->sk_allocation = GFP_KERNEL_ACCOUNT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 sk->sk_write_space = unix_write_space;
Denis V. Luneva0a53c82007-12-11 04:19:17 -0800776 sk->sk_max_ack_backlog = net->unx.sysctl_max_dgram_qlen;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700777 sk->sk_destruct = unix_sock_destructor;
778 u = unix_sk(sk);
Al Viro40ffe672012-03-14 21:54:32 -0400779 u->path.dentry = NULL;
780 u->path.mnt = NULL;
Benjamin LaHaisefd19f322006-01-03 14:10:46 -0800781 spin_lock_init(&u->lock);
Al Viro516e0cc2008-07-26 00:39:17 -0400782 atomic_long_set(&u->inflight, 0);
Miklos Szeredi1fd05ba2007-07-11 14:22:39 -0700783 INIT_LIST_HEAD(&u->link);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700784 mutex_init(&u->iolock); /* single task reading lock */
785 mutex_init(&u->bindlock); /* single task binding lock */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700786 init_waitqueue_head(&u->peer_wait);
Rainer Weikusat7d267272015-11-20 22:07:23 +0000787 init_waitqueue_func_entry(&u->peer_wake, unix_dgram_peer_wake_relay);
Eric Dumazet7123aaa2012-06-08 05:03:21 +0000788 unix_insert_socket(unix_sockets_unbound(sk), sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789out:
Pavel Emelyanov284b3272007-11-10 22:08:30 -0800790 if (sk == NULL)
Eric Dumazet518de9b2010-10-26 14:22:44 -0700791 atomic_long_dec(&unix_nr_socks);
Eric Dumazet920de802008-11-24 00:09:29 -0800792 else {
793 local_bh_disable();
Eric Dumazeta8076d82008-11-17 02:38:49 -0800794 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
Eric Dumazet920de802008-11-24 00:09:29 -0800795 local_bh_enable();
796 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797 return sk;
798}
799
Eric Paris3f378b62009-11-05 22:18:14 -0800800static int unix_create(struct net *net, struct socket *sock, int protocol,
801 int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802{
803 if (protocol && protocol != PF_UNIX)
804 return -EPROTONOSUPPORT;
805
806 sock->state = SS_UNCONNECTED;
807
808 switch (sock->type) {
809 case SOCK_STREAM:
810 sock->ops = &unix_stream_ops;
811 break;
812 /*
813 * Believe it or not BSD has AF_UNIX, SOCK_RAW though
814 * nothing uses it.
815 */
816 case SOCK_RAW:
Jianjun Konge27dfce2008-11-01 21:38:31 -0700817 sock->type = SOCK_DGRAM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818 case SOCK_DGRAM:
819 sock->ops = &unix_dgram_ops;
820 break;
821 case SOCK_SEQPACKET:
822 sock->ops = &unix_seqpacket_ops;
823 break;
824 default:
825 return -ESOCKTNOSUPPORT;
826 }
827
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500828 return unix_create1(net, sock, kern) ? 0 : -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700829}
830
831static int unix_release(struct socket *sock)
832{
833 struct sock *sk = sock->sk;
834
835 if (!sk)
836 return 0;
837
Paul Mooreded34e02013-03-25 03:18:33 +0000838 unix_release_sock(sk, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700839 sock->sk = NULL;
840
Paul Mooreded34e02013-03-25 03:18:33 +0000841 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842}
843
844static int unix_autobind(struct socket *sock)
845{
846 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +0900847 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 struct unix_sock *u = unix_sk(sk);
849 static u32 ordernum = 1;
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800850 struct unix_address *addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 int err;
Tetsuo Handa8df73ff2010-09-04 01:34:28 +0000852 unsigned int retries = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700854 err = mutex_lock_interruptible(&u->bindlock);
Sasha Levin37ab4fa2013-12-13 10:54:22 -0500855 if (err)
856 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700857
858 err = 0;
859 if (u->addr)
860 goto out;
861
862 err = -ENOMEM;
Panagiotis Issaris0da974f2006-07-21 14:51:30 -0700863 addr = kzalloc(sizeof(*addr) + sizeof(short) + 16, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864 if (!addr)
865 goto out;
866
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 addr->name->sun_family = AF_UNIX;
868 atomic_set(&addr->refcnt, 1);
869
870retry:
871 addr->len = sprintf(addr->name->sun_path+1, "%05x", ordernum) + 1 + sizeof(short);
Joe Perches07f07572008-11-19 15:44:53 -0800872 addr->hash = unix_hash_fold(csum_partial(addr->name, addr->len, 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700873
David S. Millerfbe9cc42005-12-13 23:26:29 -0800874 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875 ordernum = (ordernum+1)&0xFFFFF;
876
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800877 if (__unix_find_socket_byname(net, addr->name, addr->len, sock->type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700878 addr->hash)) {
David S. Millerfbe9cc42005-12-13 23:26:29 -0800879 spin_unlock(&unix_table_lock);
Tetsuo Handa8df73ff2010-09-04 01:34:28 +0000880 /*
881 * __unix_find_socket_byname() may take long time if many names
882 * are already in use.
883 */
884 cond_resched();
885 /* Give up if all names seems to be in use. */
886 if (retries++ == 0xFFFFF) {
887 err = -ENOSPC;
888 kfree(addr);
889 goto out;
890 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700891 goto retry;
892 }
893 addr->hash ^= sk->sk_type;
894
895 __unix_remove_socket(sk);
Al Viro713b91c2019-02-15 20:09:35 +0000896 smp_store_release(&u->addr, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897 __unix_insert_socket(&unix_socket_table[addr->hash], sk);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800898 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899 err = 0;
900
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700901out: mutex_unlock(&u->bindlock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700902 return err;
903}
904
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800905static struct sock *unix_find_other(struct net *net,
906 struct sockaddr_un *sunname, int len,
Eric Dumazet95c96172012-04-15 05:58:06 +0000907 int type, unsigned int hash, int *error)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908{
909 struct sock *u;
Al Viro421748e2008-08-02 01:04:36 -0400910 struct path path;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 int err = 0;
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +0900912
Linus Torvalds1da177e2005-04-16 15:20:36 -0700913 if (sunname->sun_path[0]) {
Al Viro421748e2008-08-02 01:04:36 -0400914 struct inode *inode;
915 err = kern_path(sunname->sun_path, LOOKUP_FOLLOW, &path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916 if (err)
917 goto fail;
Miklos Szeredieb0a4a42016-05-20 22:13:45 +0200918 inode = d_real_inode(path.dentry);
Al Viro421748e2008-08-02 01:04:36 -0400919 err = inode_permission(inode, MAY_WRITE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920 if (err)
921 goto put_fail;
922
923 err = -ECONNREFUSED;
Al Viro421748e2008-08-02 01:04:36 -0400924 if (!S_ISSOCK(inode->i_mode))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925 goto put_fail;
Eric W. Biederman6616f782010-06-13 03:35:48 +0000926 u = unix_find_socket_byinode(inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927 if (!u)
928 goto put_fail;
929
930 if (u->sk_type == type)
Al Viro68ac1232012-03-15 08:21:57 -0400931 touch_atime(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932
Al Viro421748e2008-08-02 01:04:36 -0400933 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700934
Jianjun Konge27dfce2008-11-01 21:38:31 -0700935 err = -EPROTOTYPE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936 if (u->sk_type != type) {
937 sock_put(u);
938 goto fail;
939 }
940 } else {
941 err = -ECONNREFUSED;
Jianjun Konge27dfce2008-11-01 21:38:31 -0700942 u = unix_find_socket_byname(net, sunname, len, type, hash);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943 if (u) {
944 struct dentry *dentry;
Al Viro40ffe672012-03-14 21:54:32 -0400945 dentry = unix_sk(u)->path.dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946 if (dentry)
Al Viro68ac1232012-03-15 08:21:57 -0400947 touch_atime(&unix_sk(u)->path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700948 } else
949 goto fail;
950 }
951 return u;
952
953put_fail:
Al Viro421748e2008-08-02 01:04:36 -0400954 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700955fail:
Jianjun Konge27dfce2008-11-01 21:38:31 -0700956 *error = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 return NULL;
958}
959
Linus Torvalds38f7bd92016-09-01 14:56:49 -0700960static int unix_mknod(const char *sun_path, umode_t mode, struct path *res)
Al Virofaf02012012-07-20 02:37:29 +0400961{
Linus Torvalds38f7bd92016-09-01 14:56:49 -0700962 struct dentry *dentry;
963 struct path path;
964 int err = 0;
965 /*
966 * Get the parent directory, calculate the hash for last
967 * component.
968 */
969 dentry = kern_path_create(AT_FDCWD, sun_path, &path, 0);
970 err = PTR_ERR(dentry);
971 if (IS_ERR(dentry))
972 return err;
Al Virofaf02012012-07-20 02:37:29 +0400973
Linus Torvalds38f7bd92016-09-01 14:56:49 -0700974 /*
975 * All right, let's create it.
976 */
977 err = security_path_mknod(&path, dentry, mode, 0);
Al Virofaf02012012-07-20 02:37:29 +0400978 if (!err) {
Linus Torvalds38f7bd92016-09-01 14:56:49 -0700979 err = vfs_mknod(d_inode(path.dentry), dentry, mode, 0);
Al Virofaf02012012-07-20 02:37:29 +0400980 if (!err) {
Linus Torvalds38f7bd92016-09-01 14:56:49 -0700981 res->mnt = mntget(path.mnt);
Al Virofaf02012012-07-20 02:37:29 +0400982 res->dentry = dget(dentry);
983 }
984 }
Linus Torvalds38f7bd92016-09-01 14:56:49 -0700985 done_path_create(&path, dentry);
Al Virofaf02012012-07-20 02:37:29 +0400986 return err;
987}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988
989static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
990{
991 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +0900992 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700993 struct unix_sock *u = unix_sk(sk);
Jianjun Konge27dfce2008-11-01 21:38:31 -0700994 struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
Al Virodae6ad82011-06-26 11:50:15 -0400995 char *sun_path = sunaddr->sun_path;
Linus Torvalds38f7bd92016-09-01 14:56:49 -0700996 int err;
Kyle Yan74fdd732017-03-22 13:37:08 -0700997 unsigned int hash = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 struct unix_address *addr;
999 struct hlist_head *list;
WANG Cong93ff5e02017-01-23 11:17:35 -08001000 struct path path = { NULL, NULL };
Linus Torvalds1da177e2005-04-16 15:20:36 -07001001
1002 err = -EINVAL;
Mateusz Jurczykbb842902017-06-08 11:13:36 +02001003 if (addr_len < offsetofend(struct sockaddr_un, sun_family) ||
1004 sunaddr->sun_family != AF_UNIX)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001005 goto out;
1006
Jianjun Konge27dfce2008-11-01 21:38:31 -07001007 if (addr_len == sizeof(short)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 err = unix_autobind(sock);
1009 goto out;
1010 }
1011
1012 err = unix_mkname(sunaddr, addr_len, &hash);
1013 if (err < 0)
1014 goto out;
1015 addr_len = err;
1016
WANG Cong93ff5e02017-01-23 11:17:35 -08001017 if (sun_path[0]) {
1018 umode_t mode = S_IFSOCK |
1019 (SOCK_INODE(sock)->i_mode & ~current_umask());
1020 err = unix_mknod(sun_path, mode, &path);
1021 if (err) {
1022 if (err == -EEXIST)
1023 err = -EADDRINUSE;
1024 goto out;
1025 }
1026 }
1027
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001028 err = mutex_lock_interruptible(&u->bindlock);
Sasha Levin37ab4fa2013-12-13 10:54:22 -05001029 if (err)
WANG Cong93ff5e02017-01-23 11:17:35 -08001030 goto out_put;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001031
1032 err = -EINVAL;
1033 if (u->addr)
1034 goto out_up;
1035
1036 err = -ENOMEM;
1037 addr = kmalloc(sizeof(*addr)+addr_len, GFP_KERNEL);
1038 if (!addr)
1039 goto out_up;
1040
1041 memcpy(addr->name, sunaddr, addr_len);
1042 addr->len = addr_len;
1043 addr->hash = hash ^ sk->sk_type;
1044 atomic_set(&addr->refcnt, 1);
1045
Linus Torvalds38f7bd92016-09-01 14:56:49 -07001046 if (sun_path[0]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047 addr->hash = UNIX_HASH_SIZE;
Linus Torvalds38f7bd92016-09-01 14:56:49 -07001048 hash = d_real_inode(path.dentry)->i_ino & (UNIX_HASH_SIZE - 1);
Al Virofaf02012012-07-20 02:37:29 +04001049 spin_lock(&unix_table_lock);
Linus Torvalds38f7bd92016-09-01 14:56:49 -07001050 u->path = path;
Al Virofaf02012012-07-20 02:37:29 +04001051 list = &unix_socket_table[hash];
1052 } else {
1053 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054 err = -EADDRINUSE;
Denis V. Lunev097e66c2007-11-19 22:29:30 -08001055 if (__unix_find_socket_byname(net, sunaddr, addr_len,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056 sk->sk_type, hash)) {
1057 unix_release_addr(addr);
1058 goto out_unlock;
1059 }
1060
1061 list = &unix_socket_table[addr->hash];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001062 }
1063
1064 err = 0;
1065 __unix_remove_socket(sk);
Al Viro713b91c2019-02-15 20:09:35 +00001066 smp_store_release(&u->addr, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 __unix_insert_socket(list, sk);
1068
1069out_unlock:
David S. Millerfbe9cc42005-12-13 23:26:29 -08001070 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071out_up:
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001072 mutex_unlock(&u->bindlock);
WANG Cong93ff5e02017-01-23 11:17:35 -08001073out_put:
1074 if (err)
1075 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076out:
1077 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078}
1079
David S. Miller278a3de2007-05-31 15:19:20 -07001080static void unix_state_double_lock(struct sock *sk1, struct sock *sk2)
1081{
1082 if (unlikely(sk1 == sk2) || !sk2) {
1083 unix_state_lock(sk1);
1084 return;
1085 }
1086 if (sk1 < sk2) {
1087 unix_state_lock(sk1);
1088 unix_state_lock_nested(sk2);
1089 } else {
1090 unix_state_lock(sk2);
1091 unix_state_lock_nested(sk1);
1092 }
1093}
1094
1095static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2)
1096{
1097 if (unlikely(sk1 == sk2) || !sk2) {
1098 unix_state_unlock(sk1);
1099 return;
1100 }
1101 unix_state_unlock(sk1);
1102 unix_state_unlock(sk2);
1103}
1104
Linus Torvalds1da177e2005-04-16 15:20:36 -07001105static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
1106 int alen, int flags)
1107{
1108 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001109 struct net *net = sock_net(sk);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001110 struct sockaddr_un *sunaddr = (struct sockaddr_un *)addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111 struct sock *other;
Eric Dumazet95c96172012-04-15 05:58:06 +00001112 unsigned int hash;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001113 int err;
1114
Mateusz Jurczykbb842902017-06-08 11:13:36 +02001115 err = -EINVAL;
1116 if (alen < offsetofend(struct sockaddr, sa_family))
1117 goto out;
1118
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119 if (addr->sa_family != AF_UNSPEC) {
1120 err = unix_mkname(sunaddr, alen, &hash);
1121 if (err < 0)
1122 goto out;
1123 alen = err;
1124
1125 if (test_bit(SOCK_PASSCRED, &sock->flags) &&
1126 !unix_sk(sk)->addr && (err = unix_autobind(sock)) != 0)
1127 goto out;
1128
David S. Miller278a3de2007-05-31 15:19:20 -07001129restart:
Jianjun Konge27dfce2008-11-01 21:38:31 -07001130 other = unix_find_other(net, sunaddr, alen, sock->type, hash, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 if (!other)
1132 goto out;
1133
David S. Miller278a3de2007-05-31 15:19:20 -07001134 unix_state_double_lock(sk, other);
1135
1136 /* Apparently VFS overslept socket death. Retry. */
1137 if (sock_flag(other, SOCK_DEAD)) {
1138 unix_state_double_unlock(sk, other);
1139 sock_put(other);
1140 goto restart;
1141 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142
1143 err = -EPERM;
1144 if (!unix_may_send(sk, other))
1145 goto out_unlock;
1146
1147 err = security_unix_may_send(sk->sk_socket, other->sk_socket);
1148 if (err)
1149 goto out_unlock;
1150
1151 } else {
1152 /*
1153 * 1003.1g breaking connected state with AF_UNSPEC
1154 */
1155 other = NULL;
David S. Miller278a3de2007-05-31 15:19:20 -07001156 unix_state_double_lock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157 }
1158
1159 /*
1160 * If it was connected, reconnect.
1161 */
1162 if (unix_peer(sk)) {
1163 struct sock *old_peer = unix_peer(sk);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001164 unix_peer(sk) = other;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001165 unix_dgram_peer_wake_disconnect_wakeup(sk, old_peer);
1166
David S. Miller278a3de2007-05-31 15:19:20 -07001167 unix_state_double_unlock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168
1169 if (other != old_peer)
1170 unix_dgram_disconnected(sk, old_peer);
1171 sock_put(old_peer);
1172 } else {
Jianjun Konge27dfce2008-11-01 21:38:31 -07001173 unix_peer(sk) = other;
David S. Miller278a3de2007-05-31 15:19:20 -07001174 unix_state_double_unlock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175 }
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001176 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177
1178out_unlock:
David S. Miller278a3de2007-05-31 15:19:20 -07001179 unix_state_double_unlock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 sock_put(other);
1181out:
1182 return err;
1183}
1184
1185static long unix_wait_for_peer(struct sock *other, long timeo)
1186{
1187 struct unix_sock *u = unix_sk(other);
1188 int sched;
1189 DEFINE_WAIT(wait);
1190
1191 prepare_to_wait_exclusive(&u->peer_wait, &wait, TASK_INTERRUPTIBLE);
1192
1193 sched = !sock_flag(other, SOCK_DEAD) &&
1194 !(other->sk_shutdown & RCV_SHUTDOWN) &&
Rainer Weikusat3c734192008-06-17 22:28:05 -07001195 unix_recvq_full(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196
David S. Miller1c92b4e2007-05-31 13:24:26 -07001197 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198
1199 if (sched)
1200 timeo = schedule_timeout(timeo);
1201
1202 finish_wait(&u->peer_wait, &wait);
1203 return timeo;
1204}
1205
1206static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
1207 int addr_len, int flags)
1208{
Jianjun Konge27dfce2008-11-01 21:38:31 -07001209 struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001211 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001212 struct unix_sock *u = unix_sk(sk), *newu, *otheru;
1213 struct sock *newsk = NULL;
1214 struct sock *other = NULL;
1215 struct sk_buff *skb = NULL;
Eric Dumazet95c96172012-04-15 05:58:06 +00001216 unsigned int hash;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217 int st;
1218 int err;
1219 long timeo;
1220
1221 err = unix_mkname(sunaddr, addr_len, &hash);
1222 if (err < 0)
1223 goto out;
1224 addr_len = err;
1225
Joe Perchesf64f9e72009-11-29 16:55:45 -08001226 if (test_bit(SOCK_PASSCRED, &sock->flags) && !u->addr &&
1227 (err = unix_autobind(sock)) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228 goto out;
1229
1230 timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
1231
1232 /* First of all allocate resources.
1233 If we will make it after state is locked,
1234 we will have to recheck all again in any case.
1235 */
1236
1237 err = -ENOMEM;
1238
1239 /* create new sock for complete connection */
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001240 newsk = unix_create1(sock_net(sk), NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241 if (newsk == NULL)
1242 goto out;
1243
1244 /* Allocate skb for sending to listening sock */
1245 skb = sock_wmalloc(newsk, 1, 0, GFP_KERNEL);
1246 if (skb == NULL)
1247 goto out;
1248
1249restart:
1250 /* Find listening sock. */
Denis V. Lunev097e66c2007-11-19 22:29:30 -08001251 other = unix_find_other(net, sunaddr, addr_len, sk->sk_type, hash, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252 if (!other)
1253 goto out;
1254
1255 /* Latch state of peer */
David S. Miller1c92b4e2007-05-31 13:24:26 -07001256 unix_state_lock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257
1258 /* Apparently VFS overslept socket death. Retry. */
1259 if (sock_flag(other, SOCK_DEAD)) {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001260 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 sock_put(other);
1262 goto restart;
1263 }
1264
1265 err = -ECONNREFUSED;
1266 if (other->sk_state != TCP_LISTEN)
1267 goto out_unlock;
Tomoki Sekiyama77238f22009-10-18 23:17:37 -07001268 if (other->sk_shutdown & RCV_SHUTDOWN)
1269 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001270
Rainer Weikusat3c734192008-06-17 22:28:05 -07001271 if (unix_recvq_full(other)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272 err = -EAGAIN;
1273 if (!timeo)
1274 goto out_unlock;
1275
1276 timeo = unix_wait_for_peer(other, timeo);
1277
1278 err = sock_intr_errno(timeo);
1279 if (signal_pending(current))
1280 goto out;
1281 sock_put(other);
1282 goto restart;
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001283 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284
1285 /* Latch our state.
1286
Daniel Balutae5537bf2011-03-14 15:25:33 -07001287 It is tricky place. We need to grab our state lock and cannot
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 drop lock on peer. It is dangerous because deadlock is
1289 possible. Connect to self case and simultaneous
1290 attempt to connect are eliminated by checking socket
1291 state. other is TCP_LISTEN, if sk is TCP_LISTEN we
1292 check this before attempt to grab lock.
1293
1294 Well, and we have to recheck the state after socket locked.
1295 */
1296 st = sk->sk_state;
1297
1298 switch (st) {
1299 case TCP_CLOSE:
1300 /* This is ok... continue with connect */
1301 break;
1302 case TCP_ESTABLISHED:
1303 /* Socket is already connected */
1304 err = -EISCONN;
1305 goto out_unlock;
1306 default:
1307 err = -EINVAL;
1308 goto out_unlock;
1309 }
1310
David S. Miller1c92b4e2007-05-31 13:24:26 -07001311 unix_state_lock_nested(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001312
1313 if (sk->sk_state != st) {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001314 unix_state_unlock(sk);
1315 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001316 sock_put(other);
1317 goto restart;
1318 }
1319
David S. Miller3610cda2011-01-05 15:38:53 -08001320 err = security_unix_stream_connect(sk, other, newsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001321 if (err) {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001322 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001323 goto out_unlock;
1324 }
1325
1326 /* The way is open! Fastly set all the necessary fields... */
1327
1328 sock_hold(sk);
1329 unix_peer(newsk) = sk;
1330 newsk->sk_state = TCP_ESTABLISHED;
1331 newsk->sk_type = sk->sk_type;
Eric W. Biederman109f6e32010-06-13 03:30:14 +00001332 init_peercred(newsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333 newu = unix_sk(newsk);
Eric Dumazeteaefd112011-02-18 03:26:36 +00001334 RCU_INIT_POINTER(newsk->sk_wq, &newu->peer_wq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001335 otheru = unix_sk(other);
1336
Al Viro713b91c2019-02-15 20:09:35 +00001337 /* copy address information from listening to new sock
1338 *
1339 * The contents of *(otheru->addr) and otheru->path
1340 * are seen fully set up here, since we have found
1341 * otheru in hash under unix_table_lock. Insertion
1342 * into the hash chain we'd found it in had been done
1343 * in an earlier critical area protected by unix_table_lock,
1344 * the same one where we'd set *(otheru->addr) contents,
1345 * as well as otheru->path and otheru->addr itself.
1346 *
1347 * Using smp_store_release() here to set newu->addr
1348 * is enough to make those stores, as well as stores
1349 * to newu->path visible to anyone who gets newu->addr
1350 * by smp_load_acquire(). IOW, the same warranties
1351 * as for unix_sock instances bound in unix_bind() or
1352 * in unix_autobind().
1353 */
Al Viro40ffe672012-03-14 21:54:32 -04001354 if (otheru->path.dentry) {
1355 path_get(&otheru->path);
1356 newu->path = otheru->path;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357 }
Al Viro713b91c2019-02-15 20:09:35 +00001358 atomic_inc(&otheru->addr->refcnt);
1359 smp_store_release(&newu->addr, otheru->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360
1361 /* Set credentials */
Eric W. Biederman109f6e32010-06-13 03:30:14 +00001362 copy_peercred(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364 sock->state = SS_CONNECTED;
1365 sk->sk_state = TCP_ESTABLISHED;
Benjamin LaHaise830a1e52005-12-13 23:22:32 -08001366 sock_hold(newsk);
1367
Peter Zijlstra4e857c52014-03-17 18:06:10 +01001368 smp_mb__after_atomic(); /* sock_hold() does an atomic_inc() */
Benjamin LaHaise830a1e52005-12-13 23:22:32 -08001369 unix_peer(sk) = newsk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001370
David S. Miller1c92b4e2007-05-31 13:24:26 -07001371 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372
1373 /* take ten and and send info to listening sock */
1374 spin_lock(&other->sk_receive_queue.lock);
1375 __skb_queue_tail(&other->sk_receive_queue, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376 spin_unlock(&other->sk_receive_queue.lock);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001377 unix_state_unlock(other);
David S. Miller676d2362014-04-11 16:15:36 -04001378 other->sk_data_ready(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001379 sock_put(other);
1380 return 0;
1381
1382out_unlock:
1383 if (other)
David S. Miller1c92b4e2007-05-31 13:24:26 -07001384 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385
1386out:
Wei Yongjun40d44442009-02-25 00:32:45 +00001387 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001388 if (newsk)
1389 unix_release_sock(newsk, 0);
1390 if (other)
1391 sock_put(other);
1392 return err;
1393}
1394
1395static int unix_socketpair(struct socket *socka, struct socket *sockb)
1396{
Jianjun Konge27dfce2008-11-01 21:38:31 -07001397 struct sock *ska = socka->sk, *skb = sockb->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398
1399 /* Join our sockets back to back */
1400 sock_hold(ska);
1401 sock_hold(skb);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001402 unix_peer(ska) = skb;
1403 unix_peer(skb) = ska;
Eric W. Biederman109f6e32010-06-13 03:30:14 +00001404 init_peercred(ska);
1405 init_peercred(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001406
1407 if (ska->sk_type != SOCK_DGRAM) {
1408 ska->sk_state = TCP_ESTABLISHED;
1409 skb->sk_state = TCP_ESTABLISHED;
1410 socka->state = SS_CONNECTED;
1411 sockb->state = SS_CONNECTED;
1412 }
1413 return 0;
1414}
1415
Daniel Borkmann90c6bd32013-10-17 22:51:31 +02001416static void unix_sock_inherit_flags(const struct socket *old,
1417 struct socket *new)
1418{
1419 if (test_bit(SOCK_PASSCRED, &old->flags))
1420 set_bit(SOCK_PASSCRED, &new->flags);
1421 if (test_bit(SOCK_PASSSEC, &old->flags))
1422 set_bit(SOCK_PASSSEC, &new->flags);
1423}
1424
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425static int unix_accept(struct socket *sock, struct socket *newsock, int flags)
1426{
1427 struct sock *sk = sock->sk;
1428 struct sock *tsk;
1429 struct sk_buff *skb;
1430 int err;
1431
1432 err = -EOPNOTSUPP;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001433 if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434 goto out;
1435
1436 err = -EINVAL;
1437 if (sk->sk_state != TCP_LISTEN)
1438 goto out;
1439
1440 /* If socket state is TCP_LISTEN it cannot change (for now...),
1441 * so that no locks are necessary.
1442 */
1443
1444 skb = skb_recv_datagram(sk, 0, flags&O_NONBLOCK, &err);
1445 if (!skb) {
1446 /* This means receive shutdown. */
1447 if (err == 0)
1448 err = -EINVAL;
1449 goto out;
1450 }
1451
1452 tsk = skb->sk;
1453 skb_free_datagram(sk, skb);
1454 wake_up_interruptible(&unix_sk(sk)->peer_wait);
1455
1456 /* attach accepted sock to socket */
David S. Miller1c92b4e2007-05-31 13:24:26 -07001457 unix_state_lock(tsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001458 newsock->state = SS_CONNECTED;
Daniel Borkmann90c6bd32013-10-17 22:51:31 +02001459 unix_sock_inherit_flags(sock, newsock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460 sock_graft(tsk, newsock);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001461 unix_state_unlock(tsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462 return 0;
1463
1464out:
1465 return err;
1466}
1467
1468
1469static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer)
1470{
1471 struct sock *sk = sock->sk;
Al Viro713b91c2019-02-15 20:09:35 +00001472 struct unix_address *addr;
Cyrill Gorcunov13cfa972009-11-08 05:51:19 +00001473 DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, uaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474 int err = 0;
1475
1476 if (peer) {
1477 sk = unix_peer_get(sk);
1478
1479 err = -ENOTCONN;
1480 if (!sk)
1481 goto out;
1482 err = 0;
1483 } else {
1484 sock_hold(sk);
1485 }
1486
Al Viro713b91c2019-02-15 20:09:35 +00001487 addr = smp_load_acquire(&unix_sk(sk)->addr);
1488 if (!addr) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 sunaddr->sun_family = AF_UNIX;
1490 sunaddr->sun_path[0] = 0;
1491 *uaddr_len = sizeof(short);
1492 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001493 *uaddr_len = addr->len;
1494 memcpy(sunaddr, addr->name, *uaddr_len);
1495 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 sock_put(sk);
1497out:
1498 return err;
1499}
1500
1501static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb)
1502{
1503 int i;
1504
1505 scm->fp = UNIXCB(skb).fp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506 UNIXCB(skb).fp = NULL;
1507
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001508 for (i = scm->fp->count-1; i >= 0; i--)
Hannes Frederic Sowa415e3d32016-02-03 02:11:03 +01001509 unix_notinflight(scm->fp->user, scm->fp->fp[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510}
1511
Eric W. Biederman7361c362010-06-13 03:34:33 +00001512static void unix_destruct_scm(struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513{
1514 struct scm_cookie scm;
1515 memset(&scm, 0, sizeof(scm));
Eric W. Biederman7361c362010-06-13 03:34:33 +00001516 scm.pid = UNIXCB(skb).pid;
Eric W. Biederman7361c362010-06-13 03:34:33 +00001517 if (UNIXCB(skb).fp)
1518 unix_detach_fds(&scm, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519
1520 /* Alas, it calls VFS */
1521 /* So fscking what? fput() had been SMP-safe since the last Summer */
1522 scm_destroy(&scm);
1523 sock_wfree(skb);
1524}
1525
willy tarreau712f4aa2016-01-10 07:54:56 +01001526/*
1527 * The "user->unix_inflight" variable is protected by the garbage
1528 * collection lock, and we just read it locklessly here. If you go
1529 * over the limit, there might be a tiny race in actually noticing
1530 * it across threads. Tough.
1531 */
1532static inline bool too_many_unix_fds(struct task_struct *p)
1533{
1534 struct user_struct *user = current_user();
1535
1536 if (unlikely(user->unix_inflight > task_rlimit(p, RLIMIT_NOFILE)))
1537 return !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN);
1538 return false;
1539}
1540
Eric Dumazet25888e32010-11-25 04:11:39 +00001541#define MAX_RECURSION_LEVEL 4
1542
Miklos Szeredi62093442008-11-09 15:23:57 +01001543static int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001544{
1545 int i;
Eric Dumazet25888e32010-11-25 04:11:39 +00001546 unsigned char max_level = 0;
Eric Dumazet25888e32010-11-25 04:11:39 +00001547
willy tarreau712f4aa2016-01-10 07:54:56 +01001548 if (too_many_unix_fds(current))
1549 return -ETOOMANYREFS;
1550
Eric Dumazet25888e32010-11-25 04:11:39 +00001551 for (i = scm->fp->count - 1; i >= 0; i--) {
1552 struct sock *sk = unix_get_socket(scm->fp->fp[i]);
1553
David Herrmann3575dbf2016-02-02 18:17:54 +01001554 if (sk)
Eric Dumazet25888e32010-11-25 04:11:39 +00001555 max_level = max(max_level,
1556 unix_sk(sk)->recursion_level);
Eric Dumazet25888e32010-11-25 04:11:39 +00001557 }
1558 if (unlikely(max_level > MAX_RECURSION_LEVEL))
1559 return -ETOOMANYREFS;
Miklos Szeredi62093442008-11-09 15:23:57 +01001560
1561 /*
1562 * Need to duplicate file references for the sake of garbage
1563 * collection. Otherwise a socket in the fps might become a
1564 * candidate for GC while the skb is not yet queued.
1565 */
1566 UNIXCB(skb).fp = scm_fp_dup(scm->fp);
1567 if (!UNIXCB(skb).fp)
1568 return -ENOMEM;
1569
willy tarreau712f4aa2016-01-10 07:54:56 +01001570 for (i = scm->fp->count - 1; i >= 0; i--)
Hannes Frederic Sowa415e3d32016-02-03 02:11:03 +01001571 unix_inflight(scm->fp->user, scm->fp->fp[i]);
Eric Dumazet25888e32010-11-25 04:11:39 +00001572 return max_level;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001573}
1574
David S. Millerf78a5fd2011-09-16 19:34:00 -04001575static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds)
Eric W. Biederman7361c362010-06-13 03:34:33 +00001576{
1577 int err = 0;
Eric Dumazet16e57262011-09-19 05:52:27 +00001578
David S. Millerf78a5fd2011-09-16 19:34:00 -04001579 UNIXCB(skb).pid = get_pid(scm->pid);
Eric W. Biederman6b0ee8c02013-04-03 17:28:16 +00001580 UNIXCB(skb).uid = scm->creds.uid;
1581 UNIXCB(skb).gid = scm->creds.gid;
Eric W. Biederman7361c362010-06-13 03:34:33 +00001582 UNIXCB(skb).fp = NULL;
Stephen Smalley37a9a8d2015-06-10 08:44:59 -04001583 unix_get_secdata(scm, skb);
Eric W. Biederman7361c362010-06-13 03:34:33 +00001584 if (scm->fp && send_fds)
1585 err = unix_attach_fds(scm, skb);
1586
1587 skb->destructor = unix_destruct_scm;
1588 return err;
1589}
1590
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001591static bool unix_passcred_enabled(const struct socket *sock,
1592 const struct sock *other)
1593{
1594 return test_bit(SOCK_PASSCRED, &sock->flags) ||
1595 !other->sk_socket ||
1596 test_bit(SOCK_PASSCRED, &other->sk_socket->flags);
1597}
1598
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599/*
Eric Dumazet16e57262011-09-19 05:52:27 +00001600 * Some apps rely on write() giving SCM_CREDENTIALS
1601 * We include credentials if source or destination socket
1602 * asserted SOCK_PASSCRED.
1603 */
1604static void maybe_add_creds(struct sk_buff *skb, const struct socket *sock,
1605 const struct sock *other)
1606{
Eric W. Biederman6b0ee8c02013-04-03 17:28:16 +00001607 if (UNIXCB(skb).pid)
Eric Dumazet16e57262011-09-19 05:52:27 +00001608 return;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001609 if (unix_passcred_enabled(sock, other)) {
Eric Dumazet16e57262011-09-19 05:52:27 +00001610 UNIXCB(skb).pid = get_pid(task_tgid(current));
David S. Miller6e0895c2013-04-22 20:32:51 -04001611 current_uid_gid(&UNIXCB(skb).uid, &UNIXCB(skb).gid);
Eric Dumazet16e57262011-09-19 05:52:27 +00001612 }
1613}
1614
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001615static int maybe_init_creds(struct scm_cookie *scm,
1616 struct socket *socket,
1617 const struct sock *other)
1618{
1619 int err;
1620 struct msghdr msg = { .msg_controllen = 0 };
1621
1622 err = scm_send(socket, &msg, scm, false);
1623 if (err)
1624 return err;
1625
1626 if (unix_passcred_enabled(socket, other)) {
1627 scm->pid = get_pid(task_tgid(current));
1628 current_uid_gid(&scm->creds.uid, &scm->creds.gid);
1629 }
1630 return err;
1631}
1632
1633static bool unix_skb_scm_eq(struct sk_buff *skb,
1634 struct scm_cookie *scm)
1635{
1636 const struct unix_skb_parms *u = &UNIXCB(skb);
1637
1638 return u->pid == scm->pid &&
1639 uid_eq(u->uid, scm->creds.uid) &&
1640 gid_eq(u->gid, scm->creds.gid) &&
1641 unix_secdata_eq(scm, skb);
1642}
1643
Eric Dumazet16e57262011-09-19 05:52:27 +00001644/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645 * Send AF_UNIX data.
1646 */
1647
Ying Xue1b784142015-03-02 15:37:48 +08001648static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
1649 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001650{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001651 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001652 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001653 struct unix_sock *u = unix_sk(sk);
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001654 DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001655 struct sock *other = NULL;
1656 int namelen = 0; /* fake GCC */
1657 int err;
Eric Dumazet95c96172012-04-15 05:58:06 +00001658 unsigned int hash;
David S. Millerf78a5fd2011-09-16 19:34:00 -04001659 struct sk_buff *skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001660 long timeo;
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001661 struct scm_cookie scm;
Eric Dumazet25888e32010-11-25 04:11:39 +00001662 int max_level;
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001663 int data_len = 0;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001664 int sk_locked;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001665
dann frazier5f23b732008-11-26 15:32:27 -08001666 wait_for_unix_gc();
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001667 err = scm_send(sock, msg, &scm, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001668 if (err < 0)
1669 return err;
1670
1671 err = -EOPNOTSUPP;
1672 if (msg->msg_flags&MSG_OOB)
1673 goto out;
1674
1675 if (msg->msg_namelen) {
1676 err = unix_mkname(sunaddr, msg->msg_namelen, &hash);
1677 if (err < 0)
1678 goto out;
1679 namelen = err;
1680 } else {
1681 sunaddr = NULL;
1682 err = -ENOTCONN;
1683 other = unix_peer_get(sk);
1684 if (!other)
1685 goto out;
1686 }
1687
Joe Perchesf64f9e72009-11-29 16:55:45 -08001688 if (test_bit(SOCK_PASSCRED, &sock->flags) && !u->addr
1689 && (err = unix_autobind(sock)) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 goto out;
1691
1692 err = -EMSGSIZE;
1693 if (len > sk->sk_sndbuf - 32)
1694 goto out;
1695
Kirill Tkhai31ff6aa2014-05-15 19:56:28 +04001696 if (len > SKB_MAX_ALLOC) {
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001697 data_len = min_t(size_t,
1698 len - SKB_MAX_ALLOC,
1699 MAX_SKB_FRAGS * PAGE_SIZE);
Kirill Tkhai31ff6aa2014-05-15 19:56:28 +04001700 data_len = PAGE_ALIGN(data_len);
1701
1702 BUILD_BUG_ON(SKB_MAX_ALLOC < PAGE_SIZE);
1703 }
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001704
1705 skb = sock_alloc_send_pskb(sk, len - data_len, data_len,
Eric Dumazet28d64272013-08-08 14:38:47 -07001706 msg->msg_flags & MSG_DONTWAIT, &err,
1707 PAGE_ALLOC_COSTLY_ORDER);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001708 if (skb == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709 goto out;
1710
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001711 err = unix_scm_to_skb(&scm, skb, true);
Eric Dumazet25888e32010-11-25 04:11:39 +00001712 if (err < 0)
Eric W. Biederman7361c362010-06-13 03:34:33 +00001713 goto out_free;
Eric Dumazet25888e32010-11-25 04:11:39 +00001714 max_level = err + 1;
Catherine Zhang877ce7c2006-06-29 12:27:47 -07001715
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001716 skb_put(skb, len - data_len);
1717 skb->data_len = data_len;
1718 skb->len = len;
Al Viroc0371da2014-11-24 10:42:55 -05001719 err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001720 if (err)
1721 goto out_free;
1722
1723 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1724
1725restart:
1726 if (!other) {
1727 err = -ECONNRESET;
1728 if (sunaddr == NULL)
1729 goto out_free;
1730
Denis V. Lunev097e66c2007-11-19 22:29:30 -08001731 other = unix_find_other(net, sunaddr, namelen, sk->sk_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001732 hash, &err);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001733 if (other == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001734 goto out_free;
1735 }
1736
Alban Crequyd6ae3ba2011-01-18 06:39:15 +00001737 if (sk_filter(other, skb) < 0) {
1738 /* Toss the packet but do not return any error to the sender */
1739 err = len;
1740 goto out_free;
1741 }
1742
Rainer Weikusat7d267272015-11-20 22:07:23 +00001743 sk_locked = 0;
David S. Miller1c92b4e2007-05-31 13:24:26 -07001744 unix_state_lock(other);
Rainer Weikusat7d267272015-11-20 22:07:23 +00001745restart_locked:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001746 err = -EPERM;
1747 if (!unix_may_send(sk, other))
1748 goto out_unlock;
1749
Rainer Weikusat7d267272015-11-20 22:07:23 +00001750 if (unlikely(sock_flag(other, SOCK_DEAD))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 /*
1752 * Check with 1003.1g - what should
1753 * datagram error
1754 */
David S. Miller1c92b4e2007-05-31 13:24:26 -07001755 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756 sock_put(other);
1757
Rainer Weikusat7d267272015-11-20 22:07:23 +00001758 if (!sk_locked)
1759 unix_state_lock(sk);
1760
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761 err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001762 if (unix_peer(sk) == other) {
Jianjun Konge27dfce2008-11-01 21:38:31 -07001763 unix_peer(sk) = NULL;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001764 unix_dgram_peer_wake_disconnect_wakeup(sk, other);
1765
David S. Miller1c92b4e2007-05-31 13:24:26 -07001766 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767
1768 unix_dgram_disconnected(sk, other);
1769 sock_put(other);
1770 err = -ECONNREFUSED;
1771 } else {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001772 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773 }
1774
1775 other = NULL;
1776 if (err)
1777 goto out_free;
1778 goto restart;
1779 }
1780
1781 err = -EPIPE;
1782 if (other->sk_shutdown & RCV_SHUTDOWN)
1783 goto out_unlock;
1784
1785 if (sk->sk_type != SOCK_SEQPACKET) {
1786 err = security_unix_may_send(sk->sk_socket, other->sk_socket);
1787 if (err)
1788 goto out_unlock;
1789 }
1790
Rainer Weikusata5527dd2016-02-11 19:37:27 +00001791 /* other == sk && unix_peer(other) != sk if
1792 * - unix_peer(sk) == NULL, destination address bound to sk
1793 * - unix_peer(sk) == sk by time of get but disconnected before lock
1794 */
1795 if (other != sk &&
1796 unlikely(unix_peer(other) != sk && unix_recvq_full(other))) {
Rainer Weikusat7d267272015-11-20 22:07:23 +00001797 if (timeo) {
1798 timeo = unix_wait_for_peer(other, timeo);
1799
1800 err = sock_intr_errno(timeo);
1801 if (signal_pending(current))
1802 goto out_free;
1803
1804 goto restart;
1805 }
1806
1807 if (!sk_locked) {
1808 unix_state_unlock(other);
1809 unix_state_double_lock(sk, other);
1810 }
1811
1812 if (unix_peer(sk) != other ||
1813 unix_dgram_peer_wake_me(sk, other)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814 err = -EAGAIN;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001815 sk_locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001816 goto out_unlock;
1817 }
1818
Rainer Weikusat7d267272015-11-20 22:07:23 +00001819 if (!sk_locked) {
1820 sk_locked = 1;
1821 goto restart_locked;
1822 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001823 }
1824
Rainer Weikusat7d267272015-11-20 22:07:23 +00001825 if (unlikely(sk_locked))
1826 unix_state_unlock(sk);
1827
Alban Crequy3f661162010-10-04 08:48:28 +00001828 if (sock_flag(other, SOCK_RCVTSTAMP))
1829 __net_timestamp(skb);
Eric Dumazet16e57262011-09-19 05:52:27 +00001830 maybe_add_creds(skb, sock, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001831 skb_queue_tail(&other->sk_receive_queue, skb);
Eric Dumazet25888e32010-11-25 04:11:39 +00001832 if (max_level > unix_sk(other)->recursion_level)
1833 unix_sk(other)->recursion_level = max_level;
David S. Miller1c92b4e2007-05-31 13:24:26 -07001834 unix_state_unlock(other);
David S. Miller676d2362014-04-11 16:15:36 -04001835 other->sk_data_ready(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836 sock_put(other);
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001837 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001838 return len;
1839
1840out_unlock:
Rainer Weikusat7d267272015-11-20 22:07:23 +00001841 if (sk_locked)
1842 unix_state_unlock(sk);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001843 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001844out_free:
1845 kfree_skb(skb);
1846out:
1847 if (other)
1848 sock_put(other);
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001849 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850 return err;
1851}
1852
Eric Dumazete370a722013-08-08 14:37:32 -07001853/* We use paged skbs for stream sockets, and limit occupancy to 32768
1854 * bytes, and a minimun of a full page.
1855 */
1856#define UNIX_SKB_FRAGS_SZ (PAGE_SIZE << get_order(32768))
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001857
Ying Xue1b784142015-03-02 15:37:48 +08001858static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
1859 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001860{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001861 struct sock *sk = sock->sk;
1862 struct sock *other = NULL;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001863 int err, size;
David S. Millerf78a5fd2011-09-16 19:34:00 -04001864 struct sk_buff *skb;
Jianjun Konge27dfce2008-11-01 21:38:31 -07001865 int sent = 0;
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001866 struct scm_cookie scm;
Miklos Szeredi8ba69ba2009-09-11 11:31:45 -07001867 bool fds_sent = false;
Eric Dumazet25888e32010-11-25 04:11:39 +00001868 int max_level;
Eric Dumazete370a722013-08-08 14:37:32 -07001869 int data_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001870
dann frazier5f23b732008-11-26 15:32:27 -08001871 wait_for_unix_gc();
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001872 err = scm_send(sock, msg, &scm, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001873 if (err < 0)
1874 return err;
1875
1876 err = -EOPNOTSUPP;
1877 if (msg->msg_flags&MSG_OOB)
1878 goto out_err;
1879
1880 if (msg->msg_namelen) {
1881 err = sk->sk_state == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP;
1882 goto out_err;
1883 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001884 err = -ENOTCONN;
Benjamin LaHaise830a1e52005-12-13 23:22:32 -08001885 other = unix_peer(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001886 if (!other)
1887 goto out_err;
1888 }
1889
1890 if (sk->sk_shutdown & SEND_SHUTDOWN)
1891 goto pipe_err;
1892
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001893 while (sent < len) {
Eric Dumazete370a722013-08-08 14:37:32 -07001894 size = len - sent;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001895
1896 /* Keep two messages in the pipe so it schedules better */
Eric Dumazete370a722013-08-08 14:37:32 -07001897 size = min_t(int, size, (sk->sk_sndbuf >> 1) - 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001898
Eric Dumazete370a722013-08-08 14:37:32 -07001899 /* allow fallback to order-0 allocations */
1900 size = min_t(int, size, SKB_MAX_HEAD(0) + UNIX_SKB_FRAGS_SZ);
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001901
Eric Dumazete370a722013-08-08 14:37:32 -07001902 data_len = max_t(int, 0, size - SKB_MAX_HEAD(0));
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001903
Kirill Tkhai31ff6aa2014-05-15 19:56:28 +04001904 data_len = min_t(size_t, size, PAGE_ALIGN(data_len));
1905
Eric Dumazete370a722013-08-08 14:37:32 -07001906 skb = sock_alloc_send_pskb(sk, size - data_len, data_len,
Eric Dumazet28d64272013-08-08 14:38:47 -07001907 msg->msg_flags & MSG_DONTWAIT, &err,
1908 get_order(UNIX_SKB_FRAGS_SZ));
Eric Dumazete370a722013-08-08 14:37:32 -07001909 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001910 goto out_err;
1911
David S. Millerf78a5fd2011-09-16 19:34:00 -04001912 /* Only send the fds in the first buffer */
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001913 err = unix_scm_to_skb(&scm, skb, !fds_sent);
Eric Dumazet25888e32010-11-25 04:11:39 +00001914 if (err < 0) {
Eric W. Biederman7361c362010-06-13 03:34:33 +00001915 kfree_skb(skb);
David S. Millerf78a5fd2011-09-16 19:34:00 -04001916 goto out_err;
Miklos Szeredi62093442008-11-09 15:23:57 +01001917 }
Eric Dumazet25888e32010-11-25 04:11:39 +00001918 max_level = err + 1;
Eric W. Biederman7361c362010-06-13 03:34:33 +00001919 fds_sent = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001920
Eric Dumazete370a722013-08-08 14:37:32 -07001921 skb_put(skb, size - data_len);
1922 skb->data_len = data_len;
1923 skb->len = size;
Al Viroc0371da2014-11-24 10:42:55 -05001924 err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, size);
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001925 if (err) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001926 kfree_skb(skb);
David S. Millerf78a5fd2011-09-16 19:34:00 -04001927 goto out_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001928 }
1929
David S. Miller1c92b4e2007-05-31 13:24:26 -07001930 unix_state_lock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001931
1932 if (sock_flag(other, SOCK_DEAD) ||
1933 (other->sk_shutdown & RCV_SHUTDOWN))
1934 goto pipe_err_free;
1935
Eric Dumazet16e57262011-09-19 05:52:27 +00001936 maybe_add_creds(skb, sock, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001937 skb_queue_tail(&other->sk_receive_queue, skb);
Eric Dumazet25888e32010-11-25 04:11:39 +00001938 if (max_level > unix_sk(other)->recursion_level)
1939 unix_sk(other)->recursion_level = max_level;
David S. Miller1c92b4e2007-05-31 13:24:26 -07001940 unix_state_unlock(other);
David S. Miller676d2362014-04-11 16:15:36 -04001941 other->sk_data_ready(other);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001942 sent += size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001943 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001944
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001945 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001946
1947 return sent;
1948
1949pipe_err_free:
David S. Miller1c92b4e2007-05-31 13:24:26 -07001950 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 kfree_skb(skb);
1952pipe_err:
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001953 if (sent == 0 && !(msg->msg_flags&MSG_NOSIGNAL))
1954 send_sig(SIGPIPE, current, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 err = -EPIPE;
1956out_err:
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001957 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001958 return sent ? : err;
1959}
1960
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001961static ssize_t unix_stream_sendpage(struct socket *socket, struct page *page,
1962 int offset, size_t size, int flags)
1963{
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001964 int err;
1965 bool send_sigpipe = false;
1966 bool init_scm = true;
1967 struct scm_cookie scm;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001968 struct sock *other, *sk = socket->sk;
1969 struct sk_buff *skb, *newskb = NULL, *tail = NULL;
1970
1971 if (flags & MSG_OOB)
1972 return -EOPNOTSUPP;
1973
1974 other = unix_peer(sk);
1975 if (!other || sk->sk_state != TCP_ESTABLISHED)
1976 return -ENOTCONN;
1977
1978 if (false) {
1979alloc_skb:
1980 unix_state_unlock(other);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001981 mutex_unlock(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001982 newskb = sock_alloc_send_pskb(sk, 0, 0, flags & MSG_DONTWAIT,
1983 &err, 0);
1984 if (!newskb)
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001985 goto err;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001986 }
1987
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001988 /* we must acquire iolock as we modify already present
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001989 * skbs in the sk_receive_queue and mess with skb->len
1990 */
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001991 err = mutex_lock_interruptible(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001992 if (err) {
1993 err = flags & MSG_DONTWAIT ? -EAGAIN : -ERESTARTSYS;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001994 goto err;
1995 }
1996
1997 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1998 err = -EPIPE;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001999 send_sigpipe = true;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002000 goto err_unlock;
2001 }
2002
2003 unix_state_lock(other);
2004
2005 if (sock_flag(other, SOCK_DEAD) ||
2006 other->sk_shutdown & RCV_SHUTDOWN) {
2007 err = -EPIPE;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002008 send_sigpipe = true;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002009 goto err_state_unlock;
2010 }
2011
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002012 if (init_scm) {
2013 err = maybe_init_creds(&scm, socket, other);
2014 if (err)
2015 goto err_state_unlock;
2016 init_scm = false;
2017 }
2018
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002019 skb = skb_peek_tail(&other->sk_receive_queue);
2020 if (tail && tail == skb) {
2021 skb = newskb;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002022 } else if (!skb || !unix_skb_scm_eq(skb, &scm)) {
2023 if (newskb) {
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002024 skb = newskb;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002025 } else {
2026 tail = skb;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002027 goto alloc_skb;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002028 }
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002029 } else if (newskb) {
2030 /* this is fast path, we don't necessarily need to
2031 * call to kfree_skb even though with newskb == NULL
2032 * this - does no harm
2033 */
2034 consume_skb(newskb);
Hannes Frederic Sowa8844f972015-11-16 16:25:56 +01002035 newskb = NULL;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002036 }
2037
2038 if (skb_append_pagefrags(skb, page, offset, size)) {
2039 tail = skb;
2040 goto alloc_skb;
2041 }
2042
2043 skb->len += size;
2044 skb->data_len += size;
2045 skb->truesize += size;
2046 atomic_add(size, &sk->sk_wmem_alloc);
2047
Hannes Frederic Sowaa3a116e2015-11-17 15:10:59 +01002048 if (newskb) {
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002049 err = unix_scm_to_skb(&scm, skb, false);
2050 if (err)
2051 goto err_state_unlock;
Hannes Frederic Sowaa3a116e2015-11-17 15:10:59 +01002052 spin_lock(&other->sk_receive_queue.lock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002053 __skb_queue_tail(&other->sk_receive_queue, newskb);
Hannes Frederic Sowaa3a116e2015-11-17 15:10:59 +01002054 spin_unlock(&other->sk_receive_queue.lock);
2055 }
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002056
2057 unix_state_unlock(other);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002058 mutex_unlock(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002059
2060 other->sk_data_ready(other);
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002061 scm_destroy(&scm);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002062 return size;
2063
2064err_state_unlock:
2065 unix_state_unlock(other);
2066err_unlock:
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002067 mutex_unlock(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002068err:
2069 kfree_skb(newskb);
2070 if (send_sigpipe && !(flags & MSG_NOSIGNAL))
2071 send_sig(SIGPIPE, current, 0);
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002072 if (!init_scm)
2073 scm_destroy(&scm);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02002074 return err;
2075}
2076
Ying Xue1b784142015-03-02 15:37:48 +08002077static int unix_seqpacket_sendmsg(struct socket *sock, struct msghdr *msg,
2078 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002079{
2080 int err;
2081 struct sock *sk = sock->sk;
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002082
Linus Torvalds1da177e2005-04-16 15:20:36 -07002083 err = sock_error(sk);
2084 if (err)
2085 return err;
2086
2087 if (sk->sk_state != TCP_ESTABLISHED)
2088 return -ENOTCONN;
2089
2090 if (msg->msg_namelen)
2091 msg->msg_namelen = 0;
2092
Ying Xue1b784142015-03-02 15:37:48 +08002093 return unix_dgram_sendmsg(sock, msg, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002094}
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002095
Ying Xue1b784142015-03-02 15:37:48 +08002096static int unix_seqpacket_recvmsg(struct socket *sock, struct msghdr *msg,
2097 size_t size, int flags)
Eric W. Biedermana05d2ad2011-04-24 01:54:57 +00002098{
2099 struct sock *sk = sock->sk;
2100
2101 if (sk->sk_state != TCP_ESTABLISHED)
2102 return -ENOTCONN;
2103
Ying Xue1b784142015-03-02 15:37:48 +08002104 return unix_dgram_recvmsg(sock, msg, size, flags);
Eric W. Biedermana05d2ad2011-04-24 01:54:57 +00002105}
2106
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107static void unix_copy_addr(struct msghdr *msg, struct sock *sk)
2108{
Al Viro713b91c2019-02-15 20:09:35 +00002109 struct unix_address *addr = smp_load_acquire(&unix_sk(sk)->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002110
Al Viro713b91c2019-02-15 20:09:35 +00002111 if (addr) {
2112 msg->msg_namelen = addr->len;
2113 memcpy(msg->msg_name, addr->name, addr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002114 }
2115}
2116
Ying Xue1b784142015-03-02 15:37:48 +08002117static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
2118 size_t size, int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002119{
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002120 struct scm_cookie scm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121 struct sock *sk = sock->sk;
2122 struct unix_sock *u = unix_sk(sk);
Rainer Weikusat64874282015-12-06 21:11:38 +00002123 struct sk_buff *skb, *last;
2124 long timeo;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002125 int err;
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002126 int peeked, skip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127
2128 err = -EOPNOTSUPP;
2129 if (flags&MSG_OOB)
2130 goto out;
2131
Rainer Weikusat64874282015-12-06 21:11:38 +00002132 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133
Rainer Weikusat64874282015-12-06 21:11:38 +00002134 do {
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002135 mutex_lock(&u->iolock);
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002136
Rainer Weikusat64874282015-12-06 21:11:38 +00002137 skip = sk_peek_offset(sk, flags);
2138 skb = __skb_try_recv_datagram(sk, flags, &peeked, &skip, &err,
2139 &last);
2140 if (skb)
2141 break;
2142
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002143 mutex_unlock(&u->iolock);
Rainer Weikusat64874282015-12-06 21:11:38 +00002144
2145 if (err != -EAGAIN)
2146 break;
2147 } while (timeo &&
2148 !__skb_wait_for_more_packets(sk, &err, &timeo, last));
2149
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002150 if (!skb) { /* implies iolock unlocked */
Florian Zumbiehl0a112252007-11-29 23:19:23 +11002151 unix_state_lock(sk);
2152 /* Signal EOF on disconnected non-blocking SEQPACKET socket. */
2153 if (sk->sk_type == SOCK_SEQPACKET && err == -EAGAIN &&
2154 (sk->sk_shutdown & RCV_SHUTDOWN))
2155 err = 0;
2156 unix_state_unlock(sk);
Rainer Weikusat64874282015-12-06 21:11:38 +00002157 goto out;
Florian Zumbiehl0a112252007-11-29 23:19:23 +11002158 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002159
Rainer Weikusat77b75f42015-11-26 19:23:15 +00002160 if (wq_has_sleeper(&u->peer_wait))
2161 wake_up_interruptible_sync_poll(&u->peer_wait,
2162 POLLOUT | POLLWRNORM |
2163 POLLWRBAND);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002164
2165 if (msg->msg_name)
2166 unix_copy_addr(msg, skb->sk);
2167
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002168 if (size > skb->len - skip)
2169 size = skb->len - skip;
2170 else if (size < skb->len - skip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002171 msg->msg_flags |= MSG_TRUNC;
2172
David S. Miller51f3d022014-11-05 16:46:40 -05002173 err = skb_copy_datagram_msg(skb, skip, msg, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174 if (err)
2175 goto out_free;
2176
Alban Crequy3f661162010-10-04 08:48:28 +00002177 if (sock_flag(sk, SOCK_RCVTSTAMP))
2178 __sock_recv_timestamp(msg, sk, skb);
2179
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002180 memset(&scm, 0, sizeof(scm));
2181
2182 scm_set_cred(&scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid);
2183 unix_set_secdata(&scm, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002184
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002185 if (!(flags & MSG_PEEK)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002187 unix_detach_fds(&scm, skb);
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002188
2189 sk_peek_offset_bwd(sk, skb->len);
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002190 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191 /* It is questionable: on PEEK we could:
2192 - do not return fds - good, but too simple 8)
2193 - return fds, and do not return them on read (old strategy,
2194 apparently wrong)
2195 - clone fds (I chose it for now, it is the most universal
2196 solution)
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002197
2198 POSIX 1003.1g does not actually define this clearly
2199 at all. POSIX 1003.1g doesn't define a lot of things
2200 clearly however!
2201
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202 */
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002203
2204 sk_peek_offset_fwd(sk, size);
2205
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002207 scm.fp = scm_fp_dup(UNIXCB(skb).fp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208 }
Eric Dumazet9f6f9af2012-02-21 23:24:55 +00002209 err = (flags & MSG_TRUNC) ? skb->len - skip : size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002210
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002211 scm_recv(sock, msg, &scm, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212
2213out_free:
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002214 skb_free_datagram(sk, skb);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002215 mutex_unlock(&u->iolock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216out:
2217 return err;
2218}
2219
2220/*
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002221 * Sleep until more data has arrived. But check for races..
Linus Torvalds1da177e2005-04-16 15:20:36 -07002222 */
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002223static long unix_stream_data_wait(struct sock *sk, long timeo,
WANG Cong06a77b02016-11-17 15:55:26 -08002224 struct sk_buff *last, unsigned int last_len,
2225 bool freezable)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002226{
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002227 struct sk_buff *tail;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002228 DEFINE_WAIT(wait);
2229
David S. Miller1c92b4e2007-05-31 13:24:26 -07002230 unix_state_lock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002231
2232 for (;;) {
Eric Dumazetaa395142010-04-20 13:03:51 +00002233 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002235 tail = skb_peek_tail(&sk->sk_receive_queue);
2236 if (tail != last ||
2237 (tail && tail->len != last_len) ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238 sk->sk_err ||
2239 (sk->sk_shutdown & RCV_SHUTDOWN) ||
2240 signal_pending(current) ||
2241 !timeo)
2242 break;
2243
Eric Dumazet9cd3e072015-11-29 20:03:10 -08002244 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002245 unix_state_unlock(sk);
WANG Cong06a77b02016-11-17 15:55:26 -08002246 if (freezable)
2247 timeo = freezable_schedule_timeout(timeo);
2248 else
2249 timeo = schedule_timeout(timeo);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002250 unix_state_lock(sk);
Mark Salyzynb48732e2015-05-26 08:22:19 -07002251
2252 if (sock_flag(sk, SOCK_DEAD))
2253 break;
2254
Eric Dumazet9cd3e072015-11-29 20:03:10 -08002255 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256 }
2257
Eric Dumazetaa395142010-04-20 13:03:51 +00002258 finish_wait(sk_sleep(sk), &wait);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002259 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002260 return timeo;
2261}
2262
Eric Dumazete370a722013-08-08 14:37:32 -07002263static unsigned int unix_skb_len(const struct sk_buff *skb)
2264{
2265 return skb->len - UNIXCB(skb).consumed;
2266}
2267
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002268struct unix_stream_read_state {
2269 int (*recv_actor)(struct sk_buff *, int, int,
2270 struct unix_stream_read_state *);
2271 struct socket *socket;
2272 struct msghdr *msg;
2273 struct pipe_inode_info *pipe;
2274 size_t size;
2275 int flags;
2276 unsigned int splice_flags;
2277};
2278
WANG Cong06a77b02016-11-17 15:55:26 -08002279static int unix_stream_read_generic(struct unix_stream_read_state *state,
2280 bool freezable)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002281{
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002282 struct scm_cookie scm;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002283 struct socket *sock = state->socket;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002284 struct sock *sk = sock->sk;
2285 struct unix_sock *u = unix_sk(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286 int copied = 0;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002287 int flags = state->flags;
Eric Dumazetde144392014-03-25 18:42:27 -07002288 int noblock = flags & MSG_DONTWAIT;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002289 bool check_creds = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002290 int target;
2291 int err = 0;
2292 long timeo;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002293 int skip;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002294 size_t size = state->size;
2295 unsigned int last_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002296
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002297 if (unlikely(sk->sk_state != TCP_ESTABLISHED)) {
2298 err = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299 goto out;
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002300 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002301
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002302 if (unlikely(flags & MSG_OOB)) {
2303 err = -EOPNOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002304 goto out;
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002305 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002307 target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
Eric Dumazetde144392014-03-25 18:42:27 -07002308 timeo = sock_rcvtimeo(sk, noblock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002309
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002310 memset(&scm, 0, sizeof(scm));
2311
Linus Torvalds1da177e2005-04-16 15:20:36 -07002312 /* Lock the socket to prevent queue disordering
2313 * while sleeps in memcpy_tomsg
2314 */
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002315 mutex_lock(&u->iolock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002316
Andrey Vagine9193d62015-10-02 00:05:36 +03002317 if (flags & MSG_PEEK)
2318 skip = sk_peek_offset(sk, flags);
2319 else
2320 skip = 0;
2321
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002322 do {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002323 int chunk;
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002324 bool drop_skb;
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002325 struct sk_buff *skb, *last;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002326
Rainer Weikusat18eceb82016-02-18 12:39:46 +00002327redo:
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002328 unix_state_lock(sk);
Mark Salyzynb48732e2015-05-26 08:22:19 -07002329 if (sock_flag(sk, SOCK_DEAD)) {
2330 err = -ECONNRESET;
2331 goto unlock;
2332 }
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002333 last = skb = skb_peek(&sk->sk_receive_queue);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002334 last_len = last ? last->len : 0;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002335again:
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002336 if (skb == NULL) {
Eric Dumazet25888e32010-11-25 04:11:39 +00002337 unix_sk(sk)->recursion_level = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 if (copied >= target)
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002339 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340
2341 /*
2342 * POSIX 1003.1g mandates this order.
2343 */
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002344
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002345 err = sock_error(sk);
2346 if (err)
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002347 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002348 if (sk->sk_shutdown & RCV_SHUTDOWN)
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002349 goto unlock;
2350
2351 unix_state_unlock(sk);
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002352 if (!timeo) {
2353 err = -EAGAIN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002354 break;
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002355 }
2356
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002357 mutex_unlock(&u->iolock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002358
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002359 timeo = unix_stream_data_wait(sk, timeo, last,
WANG Cong06a77b02016-11-17 15:55:26 -08002360 last_len, freezable);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002361
Rainer Weikusat3822b5c2015-12-16 20:09:25 +00002362 if (signal_pending(current)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002363 err = sock_intr_errno(timeo);
Eric Dumazetfa0dc042016-01-24 13:53:50 -08002364 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002365 goto out;
2366 }
Rainer Weikusatb3ca9b02011-02-28 04:50:55 +00002367
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002368 mutex_lock(&u->iolock);
Rainer Weikusat18eceb82016-02-18 12:39:46 +00002369 goto redo;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002370unlock:
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002371 unix_state_unlock(sk);
2372 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002373 }
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002374
Eric Dumazete370a722013-08-08 14:37:32 -07002375 while (skip >= unix_skb_len(skb)) {
2376 skip -= unix_skb_len(skb);
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002377 last = skb;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002378 last_len = skb->len;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002379 skb = skb_peek_next(skb, &sk->sk_receive_queue);
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002380 if (!skb)
2381 goto again;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002382 }
2383
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002384 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385
2386 if (check_creds) {
2387 /* Never glue messages from different writers */
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002388 if (!unix_skb_scm_eq(skb, &scm))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002389 break;
Eric W. Biederman0e82e7f6d2013-04-03 16:14:47 +00002390 } else if (test_bit(SOCK_PASSCRED, &sock->flags)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002391 /* Copy credentials */
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002392 scm_set_cred(&scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid);
Stephen Smalley37a9a8d2015-06-10 08:44:59 -04002393 unix_set_secdata(&scm, skb);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002394 check_creds = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002395 }
2396
2397 /* Copy address just once */
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002398 if (state->msg && state->msg->msg_name) {
2399 DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr,
2400 state->msg->msg_name);
2401 unix_copy_addr(state->msg, skb->sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002402 sunaddr = NULL;
2403 }
2404
Eric Dumazete370a722013-08-08 14:37:32 -07002405 chunk = min_t(unsigned int, unix_skb_len(skb) - skip, size);
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002406 skb_get(skb);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002407 chunk = state->recv_actor(skb, skip, chunk, state);
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002408 drop_skb = !unix_skb_len(skb);
2409 /* skb is only safe to use if !drop_skb */
2410 consume_skb(skb);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002411 if (chunk < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002412 if (copied == 0)
2413 copied = -EFAULT;
2414 break;
2415 }
2416 copied += chunk;
2417 size -= chunk;
2418
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002419 if (drop_skb) {
2420 /* the skb was touched by a concurrent reader;
2421 * we should not expect anything from this skb
2422 * anymore and assume it invalid - we can be
2423 * sure it was dropped from the socket queue
2424 *
2425 * let's report a short read
2426 */
2427 err = 0;
2428 break;
2429 }
2430
Linus Torvalds1da177e2005-04-16 15:20:36 -07002431 /* Mark read part of skb as used */
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002432 if (!(flags & MSG_PEEK)) {
Eric Dumazete370a722013-08-08 14:37:32 -07002433 UNIXCB(skb).consumed += chunk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002434
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002435 sk_peek_offset_bwd(sk, chunk);
2436
Linus Torvalds1da177e2005-04-16 15:20:36 -07002437 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002438 unix_detach_fds(&scm, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002439
Eric Dumazete370a722013-08-08 14:37:32 -07002440 if (unix_skb_len(skb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002442
Eric Dumazet6f01fd62012-01-28 16:11:03 +00002443 skb_unlink(skb, &sk->sk_receive_queue);
Neil Horman70d4bf62010-07-20 06:45:56 +00002444 consume_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002445
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002446 if (scm.fp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002447 break;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002448 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002449 /* It is questionable, see note in unix_dgram_recvmsg.
2450 */
2451 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002452 scm.fp = scm_fp_dup(UNIXCB(skb).fp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002453
Andrey Vagine9193d62015-10-02 00:05:36 +03002454 sk_peek_offset_fwd(sk, chunk);
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002455
Aaron Conole9f389e32015-09-26 18:50:43 -04002456 if (UNIXCB(skb).fp)
2457 break;
2458
Andrey Vagine9193d62015-10-02 00:05:36 +03002459 skip = 0;
Aaron Conole9f389e32015-09-26 18:50:43 -04002460 last = skb;
2461 last_len = skb->len;
2462 unix_state_lock(sk);
2463 skb = skb_peek_next(skb, &sk->sk_receive_queue);
2464 if (skb)
2465 goto again;
2466 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002467 break;
2468 }
2469 } while (size);
2470
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002471 mutex_unlock(&u->iolock);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002472 if (state->msg)
2473 scm_recv(sock, state->msg, &scm, flags);
2474 else
2475 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476out:
2477 return copied ? : err;
2478}
2479
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002480static int unix_stream_read_actor(struct sk_buff *skb,
2481 int skip, int chunk,
2482 struct unix_stream_read_state *state)
2483{
2484 int ret;
2485
2486 ret = skb_copy_datagram_msg(skb, UNIXCB(skb).consumed + skip,
2487 state->msg, chunk);
2488 return ret ?: chunk;
2489}
2490
2491static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg,
2492 size_t size, int flags)
2493{
2494 struct unix_stream_read_state state = {
2495 .recv_actor = unix_stream_read_actor,
2496 .socket = sock,
2497 .msg = msg,
2498 .size = size,
2499 .flags = flags
2500 };
2501
WANG Cong06a77b02016-11-17 15:55:26 -08002502 return unix_stream_read_generic(&state, true);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002503}
2504
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002505static int unix_stream_splice_actor(struct sk_buff *skb,
2506 int skip, int chunk,
2507 struct unix_stream_read_state *state)
2508{
2509 return skb_splice_bits(skb, state->socket->sk,
2510 UNIXCB(skb).consumed + skip,
Al Viro25869262016-09-17 21:02:10 -04002511 state->pipe, chunk, state->splice_flags);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002512}
2513
2514static ssize_t unix_stream_splice_read(struct socket *sock, loff_t *ppos,
2515 struct pipe_inode_info *pipe,
2516 size_t size, unsigned int flags)
2517{
2518 struct unix_stream_read_state state = {
2519 .recv_actor = unix_stream_splice_actor,
2520 .socket = sock,
2521 .pipe = pipe,
2522 .size = size,
2523 .splice_flags = flags,
2524 };
2525
2526 if (unlikely(*ppos))
2527 return -ESPIPE;
2528
2529 if (sock->file->f_flags & O_NONBLOCK ||
2530 flags & SPLICE_F_NONBLOCK)
2531 state.flags = MSG_DONTWAIT;
2532
WANG Cong06a77b02016-11-17 15:55:26 -08002533 return unix_stream_read_generic(&state, false);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002534}
2535
Linus Torvalds1da177e2005-04-16 15:20:36 -07002536static int unix_shutdown(struct socket *sock, int mode)
2537{
2538 struct sock *sk = sock->sk;
2539 struct sock *other;
2540
Xi Wangfc61b922012-08-26 16:47:13 +00002541 if (mode < SHUT_RD || mode > SHUT_RDWR)
2542 return -EINVAL;
2543 /* This maps:
2544 * SHUT_RD (0) -> RCV_SHUTDOWN (1)
2545 * SHUT_WR (1) -> SEND_SHUTDOWN (2)
2546 * SHUT_RDWR (2) -> SHUTDOWN_MASK (3)
2547 */
2548 ++mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002549
Alban Crequy7180a032011-01-19 04:56:36 +00002550 unix_state_lock(sk);
2551 sk->sk_shutdown |= mode;
2552 other = unix_peer(sk);
2553 if (other)
2554 sock_hold(other);
2555 unix_state_unlock(sk);
2556 sk->sk_state_change(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002557
Alban Crequy7180a032011-01-19 04:56:36 +00002558 if (other &&
2559 (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002560
Alban Crequy7180a032011-01-19 04:56:36 +00002561 int peer_mode = 0;
2562
2563 if (mode&RCV_SHUTDOWN)
2564 peer_mode |= SEND_SHUTDOWN;
2565 if (mode&SEND_SHUTDOWN)
2566 peer_mode |= RCV_SHUTDOWN;
2567 unix_state_lock(other);
2568 other->sk_shutdown |= peer_mode;
2569 unix_state_unlock(other);
2570 other->sk_state_change(other);
2571 if (peer_mode == SHUTDOWN_MASK)
2572 sk_wake_async(other, SOCK_WAKE_WAITD, POLL_HUP);
2573 else if (peer_mode & RCV_SHUTDOWN)
2574 sk_wake_async(other, SOCK_WAKE_WAITD, POLL_IN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002575 }
Alban Crequy7180a032011-01-19 04:56:36 +00002576 if (other)
2577 sock_put(other);
2578
Linus Torvalds1da177e2005-04-16 15:20:36 -07002579 return 0;
2580}
2581
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002582long unix_inq_len(struct sock *sk)
2583{
2584 struct sk_buff *skb;
2585 long amount = 0;
2586
2587 if (sk->sk_state == TCP_LISTEN)
2588 return -EINVAL;
2589
2590 spin_lock(&sk->sk_receive_queue.lock);
2591 if (sk->sk_type == SOCK_STREAM ||
2592 sk->sk_type == SOCK_SEQPACKET) {
2593 skb_queue_walk(&sk->sk_receive_queue, skb)
Eric Dumazete370a722013-08-08 14:37:32 -07002594 amount += unix_skb_len(skb);
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002595 } else {
2596 skb = skb_peek(&sk->sk_receive_queue);
2597 if (skb)
2598 amount = skb->len;
2599 }
2600 spin_unlock(&sk->sk_receive_queue.lock);
2601
2602 return amount;
2603}
2604EXPORT_SYMBOL_GPL(unix_inq_len);
2605
2606long unix_outq_len(struct sock *sk)
2607{
2608 return sk_wmem_alloc_get(sk);
2609}
2610EXPORT_SYMBOL_GPL(unix_outq_len);
2611
Linus Torvalds1da177e2005-04-16 15:20:36 -07002612static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
2613{
2614 struct sock *sk = sock->sk;
Jianjun Konge27dfce2008-11-01 21:38:31 -07002615 long amount = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002616 int err;
2617
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002618 switch (cmd) {
2619 case SIOCOUTQ:
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002620 amount = unix_outq_len(sk);
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002621 err = put_user(amount, (int __user *)arg);
2622 break;
2623 case SIOCINQ:
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002624 amount = unix_inq_len(sk);
2625 if (amount < 0)
2626 err = amount;
2627 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002628 err = put_user(amount, (int __user *)arg);
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002629 break;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002630 default:
2631 err = -ENOIOCTLCMD;
2632 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002633 }
2634 return err;
2635}
2636
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002637static unsigned int unix_poll(struct file *file, struct socket *sock, poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002638{
2639 struct sock *sk = sock->sk;
2640 unsigned int mask;
2641
Eric Dumazetaa395142010-04-20 13:03:51 +00002642 sock_poll_wait(file, sk_sleep(sk), wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002643 mask = 0;
2644
2645 /* exceptional events? */
2646 if (sk->sk_err)
2647 mask |= POLLERR;
2648 if (sk->sk_shutdown == SHUTDOWN_MASK)
2649 mask |= POLLHUP;
Davide Libenzif348d702006-03-25 03:07:39 -08002650 if (sk->sk_shutdown & RCV_SHUTDOWN)
Eric Dumazetdb409802010-09-06 11:13:50 +00002651 mask |= POLLRDHUP | POLLIN | POLLRDNORM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002652
2653 /* readable? */
Eric Dumazetdb409802010-09-06 11:13:50 +00002654 if (!skb_queue_empty(&sk->sk_receive_queue))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002655 mask |= POLLIN | POLLRDNORM;
2656
2657 /* Connection-based need to check for termination and startup */
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002658 if ((sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) &&
2659 sk->sk_state == TCP_CLOSE)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002660 mask |= POLLHUP;
2661
2662 /*
2663 * we set writable also when the other side has shut down the
2664 * connection. This prevents stuck sockets.
2665 */
2666 if (unix_writable(sk))
2667 mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
2668
2669 return mask;
2670}
2671
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002672static unsigned int unix_dgram_poll(struct file *file, struct socket *sock,
2673 poll_table *wait)
Rainer Weikusat3c734192008-06-17 22:28:05 -07002674{
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002675 struct sock *sk = sock->sk, *other;
2676 unsigned int mask, writable;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002677
Eric Dumazetaa395142010-04-20 13:03:51 +00002678 sock_poll_wait(file, sk_sleep(sk), wait);
Rainer Weikusat3c734192008-06-17 22:28:05 -07002679 mask = 0;
2680
2681 /* exceptional events? */
2682 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
Keller, Jacob E7d4c04f2013-03-28 11:19:25 +00002683 mask |= POLLERR |
Jacob Keller8facd5f2013-04-02 13:55:40 -07002684 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? POLLPRI : 0);
Keller, Jacob E7d4c04f2013-03-28 11:19:25 +00002685
Rainer Weikusat3c734192008-06-17 22:28:05 -07002686 if (sk->sk_shutdown & RCV_SHUTDOWN)
Eric Dumazet5456f092010-10-31 05:36:23 +00002687 mask |= POLLRDHUP | POLLIN | POLLRDNORM;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002688 if (sk->sk_shutdown == SHUTDOWN_MASK)
2689 mask |= POLLHUP;
2690
2691 /* readable? */
Eric Dumazet5456f092010-10-31 05:36:23 +00002692 if (!skb_queue_empty(&sk->sk_receive_queue))
Rainer Weikusat3c734192008-06-17 22:28:05 -07002693 mask |= POLLIN | POLLRDNORM;
2694
2695 /* Connection-based need to check for termination and startup */
2696 if (sk->sk_type == SOCK_SEQPACKET) {
2697 if (sk->sk_state == TCP_CLOSE)
2698 mask |= POLLHUP;
2699 /* connection hasn't started yet? */
2700 if (sk->sk_state == TCP_SYN_SENT)
2701 return mask;
2702 }
2703
Eric Dumazet973a34a2010-10-31 05:38:25 +00002704 /* No write status requested, avoid expensive OUT tests. */
Hans Verkuil626cf232012-03-23 15:02:27 -07002705 if (!(poll_requested_events(wait) & (POLLWRBAND|POLLWRNORM|POLLOUT)))
Eric Dumazet973a34a2010-10-31 05:38:25 +00002706 return mask;
2707
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002708 writable = unix_writable(sk);
Rainer Weikusat7d267272015-11-20 22:07:23 +00002709 if (writable) {
2710 unix_state_lock(sk);
2711
2712 other = unix_peer(sk);
2713 if (other && unix_peer(other) != sk &&
2714 unix_recvq_full(other) &&
2715 unix_dgram_peer_wake_me(sk, other))
2716 writable = 0;
2717
2718 unix_state_unlock(sk);
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002719 }
2720
2721 if (writable)
Rainer Weikusat3c734192008-06-17 22:28:05 -07002722 mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
2723 else
Eric Dumazet9cd3e072015-11-29 20:03:10 -08002724 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
Rainer Weikusat3c734192008-06-17 22:28:05 -07002725
Rainer Weikusat3c734192008-06-17 22:28:05 -07002726 return mask;
2727}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002728
2729#ifdef CONFIG_PROC_FS
Pavel Emelyanova53eb3f2007-11-23 20:30:01 +08002730
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002731#define BUCKET_SPACE (BITS_PER_LONG - (UNIX_HASH_BITS + 1) - 1)
2732
2733#define get_bucket(x) ((x) >> BUCKET_SPACE)
2734#define get_offset(x) ((x) & ((1L << BUCKET_SPACE) - 1))
2735#define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o))
Pavel Emelyanova53eb3f2007-11-23 20:30:01 +08002736
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002737static struct sock *unix_from_bucket(struct seq_file *seq, loff_t *pos)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002738{
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002739 unsigned long offset = get_offset(*pos);
2740 unsigned long bucket = get_bucket(*pos);
2741 struct sock *sk;
2742 unsigned long count = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002743
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002744 for (sk = sk_head(&unix_socket_table[bucket]); sk; sk = sk_next(sk)) {
2745 if (sock_net(sk) != seq_file_net(seq))
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002746 continue;
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002747 if (++count == offset)
2748 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002749 }
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002750
2751 return sk;
2752}
2753
2754static struct sock *unix_next_socket(struct seq_file *seq,
2755 struct sock *sk,
2756 loff_t *pos)
2757{
2758 unsigned long bucket;
2759
2760 while (sk > (struct sock *)SEQ_START_TOKEN) {
2761 sk = sk_next(sk);
2762 if (!sk)
2763 goto next_bucket;
2764 if (sock_net(sk) == seq_file_net(seq))
2765 return sk;
2766 }
2767
2768 do {
2769 sk = unix_from_bucket(seq, pos);
2770 if (sk)
2771 return sk;
2772
2773next_bucket:
2774 bucket = get_bucket(*pos) + 1;
2775 *pos = set_bucket_offset(bucket, 1);
2776 } while (bucket < ARRAY_SIZE(unix_socket_table));
2777
Linus Torvalds1da177e2005-04-16 15:20:36 -07002778 return NULL;
2779}
2780
Linus Torvalds1da177e2005-04-16 15:20:36 -07002781static void *unix_seq_start(struct seq_file *seq, loff_t *pos)
Eric Dumazet9a429c42008-01-01 21:58:02 -08002782 __acquires(unix_table_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002783{
David S. Millerfbe9cc42005-12-13 23:26:29 -08002784 spin_lock(&unix_table_lock);
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002785
2786 if (!*pos)
2787 return SEQ_START_TOKEN;
2788
2789 if (get_bucket(*pos) >= ARRAY_SIZE(unix_socket_table))
2790 return NULL;
2791
2792 return unix_next_socket(seq, NULL, pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002793}
2794
2795static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2796{
2797 ++*pos;
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002798 return unix_next_socket(seq, v, pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002799}
2800
2801static void unix_seq_stop(struct seq_file *seq, void *v)
Eric Dumazet9a429c42008-01-01 21:58:02 -08002802 __releases(unix_table_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002803{
David S. Millerfbe9cc42005-12-13 23:26:29 -08002804 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002805}
2806
2807static int unix_seq_show(struct seq_file *seq, void *v)
2808{
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002809
Joe Perchesb9f31242008-04-12 19:04:38 -07002810 if (v == SEQ_START_TOKEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002811 seq_puts(seq, "Num RefCount Protocol Flags Type St "
2812 "Inode Path\n");
2813 else {
2814 struct sock *s = v;
2815 struct unix_sock *u = unix_sk(s);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002816 unix_state_lock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002817
Dan Rosenberg71338aa2011-05-23 12:17:35 +00002818 seq_printf(seq, "%pK: %08X %08X %08X %04X %02X %5lu",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002819 s,
2820 atomic_read(&s->sk_refcnt),
2821 0,
2822 s->sk_state == TCP_LISTEN ? __SO_ACCEPTCON : 0,
2823 s->sk_type,
2824 s->sk_socket ?
2825 (s->sk_state == TCP_ESTABLISHED ? SS_CONNECTED : SS_UNCONNECTED) :
2826 (s->sk_state == TCP_ESTABLISHED ? SS_CONNECTING : SS_DISCONNECTING),
2827 sock_i_ino(s));
2828
Al Viro713b91c2019-02-15 20:09:35 +00002829 if (u->addr) { // under unix_table_lock here
Linus Torvalds1da177e2005-04-16 15:20:36 -07002830 int i, len;
2831 seq_putc(seq, ' ');
2832
2833 i = 0;
2834 len = u->addr->len - sizeof(short);
2835 if (!UNIX_ABSTRACT(s))
2836 len--;
2837 else {
2838 seq_putc(seq, '@');
2839 i++;
2840 }
2841 for ( ; i < len; i++)
Isaac Boukrise7947ea2016-11-01 02:41:35 +02002842 seq_putc(seq, u->addr->name->sun_path[i] ?:
2843 '@');
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844 }
David S. Miller1c92b4e2007-05-31 13:24:26 -07002845 unix_state_unlock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002846 seq_putc(seq, '\n');
2847 }
2848
2849 return 0;
2850}
2851
Philippe De Muyter56b3d972007-07-10 23:07:31 -07002852static const struct seq_operations unix_seq_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853 .start = unix_seq_start,
2854 .next = unix_seq_next,
2855 .stop = unix_seq_stop,
2856 .show = unix_seq_show,
2857};
2858
Linus Torvalds1da177e2005-04-16 15:20:36 -07002859static int unix_seq_open(struct inode *inode, struct file *file)
2860{
Denis V. Luneve372c412007-11-19 22:31:54 -08002861 return seq_open_net(inode, file, &unix_seq_ops,
Eric Dumazet8b51b062012-06-08 22:10:20 +00002862 sizeof(struct seq_net_private));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002863}
2864
Arjan van de Venda7071d2007-02-12 00:55:36 -08002865static const struct file_operations unix_seq_fops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002866 .owner = THIS_MODULE,
2867 .open = unix_seq_open,
2868 .read = seq_read,
2869 .llseek = seq_lseek,
Denis V. Luneve372c412007-11-19 22:31:54 -08002870 .release = seq_release_net,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871};
2872
2873#endif
2874
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00002875static const struct net_proto_family unix_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876 .family = PF_UNIX,
2877 .create = unix_create,
2878 .owner = THIS_MODULE,
2879};
2880
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002881
Alexey Dobriyan2c8c1e72010-01-17 03:35:32 +00002882static int __net_init unix_net_init(struct net *net)
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002883{
2884 int error = -ENOMEM;
2885
Denis V. Luneva0a53c82007-12-11 04:19:17 -08002886 net->unx.sysctl_max_dgram_qlen = 10;
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002887 if (unix_sysctl_register(net))
2888 goto out;
Pavel Emelyanovd392e492007-12-01 23:44:15 +11002889
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002890#ifdef CONFIG_PROC_FS
Gao fengd4beaa62013-02-18 01:34:54 +00002891 if (!proc_create("unix", 0, net->proc_net, &unix_seq_fops)) {
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002892 unix_sysctl_unregister(net);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002893 goto out;
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002894 }
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002895#endif
2896 error = 0;
2897out:
Jianjun Kong48dcc33e2008-11-01 21:37:27 -07002898 return error;
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002899}
2900
Alexey Dobriyan2c8c1e72010-01-17 03:35:32 +00002901static void __net_exit unix_net_exit(struct net *net)
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002902{
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002903 unix_sysctl_unregister(net);
Gao fengece31ff2013-02-18 01:34:56 +00002904 remove_proc_entry("unix", net->proc_net);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002905}
2906
2907static struct pernet_operations unix_net_ops = {
2908 .init = unix_net_init,
2909 .exit = unix_net_exit,
2910};
2911
Linus Torvalds1da177e2005-04-16 15:20:36 -07002912static int __init af_unix_init(void)
2913{
2914 int rc = -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915
YOSHIFUJI Hideaki / 吉藤英明b4fff5f2013-01-09 07:20:07 +00002916 BUILD_BUG_ON(sizeof(struct unix_skb_parms) > FIELD_SIZEOF(struct sk_buff, cb));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002917
2918 rc = proto_register(&unix_proto, 1);
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002919 if (rc != 0) {
wangweidong5cc208b2013-12-06 18:03:36 +08002920 pr_crit("%s: Cannot create unix_sock SLAB cache!\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002921 goto out;
2922 }
2923
2924 sock_register(&unix_family_ops);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002925 register_pernet_subsys(&unix_net_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002926out:
2927 return rc;
2928}
2929
2930static void __exit af_unix_exit(void)
2931{
2932 sock_unregister(PF_UNIX);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002933 proto_unregister(&unix_proto);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002934 unregister_pernet_subsys(&unix_net_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935}
2936
David Woodhouse3d366962008-04-24 00:59:25 -07002937/* Earlier than device_initcall() so that other drivers invoking
2938 request_module() don't end up in a loop when modprobe tries
2939 to use a UNIX socket. But later than subsys_initcall() because
2940 we depend on stuff initialised there */
2941fs_initcall(af_unix_init);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002942module_exit(af_unix_exit);
2943
2944MODULE_LICENSE("GPL");
2945MODULE_ALIAS_NETPROTO(PF_UNIX);