blob: e18ca6d9f3d414793bcb625ce28facc2d9c73b5f [file] [log] [blame]
Thomas Gleixner2874c5f2019-05-27 08:55:01 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * NET4: Implementation of BSD Unix domain sockets.
4 *
Alan Cox113aa832008-10-13 19:01:08 -07005 * Authors: Alan Cox, <alan@lxorguk.ukuu.org.uk>
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07007 * Fixes:
8 * Linus Torvalds : Assorted bug cures.
9 * Niibe Yutaka : async I/O support.
10 * Carsten Paeth : PF_UNIX check, address fixes.
11 * Alan Cox : Limit size of allocated blocks.
12 * Alan Cox : Fixed the stupid socketpair bug.
13 * Alan Cox : BSD compatibility fine tuning.
14 * Alan Cox : Fixed a bug in connect when interrupted.
15 * Alan Cox : Sorted out a proper draft version of
16 * file descriptor passing hacked up from
17 * Mike Shaver's work.
18 * Marty Leisner : Fixes to fd passing
19 * Nick Nevin : recvmsg bugfix.
20 * Alan Cox : Started proper garbage collector
21 * Heiko EiBfeldt : Missing verify_area check
22 * Alan Cox : Started POSIXisms
23 * Andreas Schwab : Replace inode by dentry for proper
24 * reference counting
25 * Kirk Petersen : Made this a module
26 * Christoph Rohland : Elegant non-blocking accept/connect algorithm.
27 * Lots of bug fixes.
28 * Alexey Kuznetosv : Repaired (I hope) bugs introduces
29 * by above two patches.
30 * Andrea Arcangeli : If possible we block in connect(2)
31 * if the max backlog of the listen socket
32 * is been reached. This won't break
33 * old apps and it will avoid huge amount
34 * of socks hashed (this for unix_gc()
35 * performances reasons).
36 * Security fix that limits the max
37 * number of socks to 2*max_files and
38 * the number of skb queueable in the
39 * dgram receiver.
40 * Artur Skawina : Hash function optimizations
41 * Alexey Kuznetsov : Full scale SMP. Lot of bugs are introduced 8)
42 * Malcolm Beattie : Set peercred for socketpair
43 * Michal Ostrowski : Module initialization cleanup.
44 * Arnaldo C. Melo : Remove MOD_{INC,DEC}_USE_COUNT,
45 * the core infrastructure is doing that
46 * for all net proto families now (2.5.69+)
47 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070048 * Known differences from reference BSD that was tested:
49 *
50 * [TO FIX]
51 * ECONNREFUSED is not returned from one end of a connected() socket to the
52 * other the moment one end closes.
53 * fstat() doesn't return st_dev=0, and give the blksize as high water mark
54 * and a fake inode identifier (nor the BSD first socket fstat twice bug).
55 * [NOT TO FIX]
56 * accept() returns a path name even if the connecting socket has closed
57 * in the meantime (BSD loses the path and gives up).
58 * accept() returns 0 length path for an unbound connector. BSD returns 16
59 * and a null first byte in the path (but not for gethost/peername - BSD bug ??)
60 * socketpair(...SOCK_RAW..) doesn't panic the kernel.
61 * BSD af_unix apparently has connect forgetting to block properly.
62 * (need to check this with the POSIX spec in detail)
63 *
64 * Differences from 2.0.0-11-... (ANK)
65 * Bug fixes and improvements.
66 * - client shutdown killed server socket.
67 * - removed all useless cli/sti pairs.
68 *
69 * Semantic changes/extensions.
70 * - generic control message passing.
71 * - SCM_CREDENTIALS control message.
72 * - "Abstract" (not FS based) socket bindings.
73 * Abstract names are sequences of bytes (not zero terminated)
74 * started by 0, so that this name space does not intersect
75 * with BSD names.
76 */
77
wangweidong5cc208b2013-12-06 18:03:36 +080078#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
79
Linus Torvalds1da177e2005-04-16 15:20:36 -070080#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070081#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070082#include <linux/signal.h>
Ingo Molnar3f07c012017-02-08 18:51:30 +010083#include <linux/sched/signal.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070084#include <linux/errno.h>
85#include <linux/string.h>
86#include <linux/stat.h>
87#include <linux/dcache.h>
88#include <linux/namei.h>
89#include <linux/socket.h>
90#include <linux/un.h>
91#include <linux/fcntl.h>
92#include <linux/termios.h>
93#include <linux/sockios.h>
94#include <linux/net.h>
95#include <linux/in.h>
96#include <linux/fs.h>
97#include <linux/slab.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080098#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070099#include <linux/skbuff.h>
100#include <linux/netdevice.h>
Eric W. Biederman457c4cb2007-09-12 12:01:34 +0200101#include <net/net_namespace.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102#include <net/sock.h>
Arnaldo Carvalho de Meloc752f072005-08-09 20:08:28 -0700103#include <net/tcp_states.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104#include <net/af_unix.h>
105#include <linux/proc_fs.h>
106#include <linux/seq_file.h>
107#include <net/scm.h>
108#include <linux/init.h>
109#include <linux/poll.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110#include <linux/rtnetlink.h>
111#include <linux/mount.h>
112#include <net/checksum.h>
113#include <linux/security.h>
Colin Cross2b15af62013-05-06 23:50:21 +0000114#include <linux/freezer.h>
Andrey Vaginba94f302017-02-01 11:00:45 -0800115#include <linux/file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116
Jens Axboef4e65872019-02-08 09:01:44 -0700117#include "scm.h"
118
Eric Dumazet7123aaa2012-06-08 05:03:21 +0000119struct hlist_head unix_socket_table[2 * UNIX_HASH_SIZE];
Pavel Emelyanovfa7ff562011-12-15 02:44:03 +0000120EXPORT_SYMBOL_GPL(unix_socket_table);
121DEFINE_SPINLOCK(unix_table_lock);
122EXPORT_SYMBOL_GPL(unix_table_lock);
Eric Dumazet518de9b2010-10-26 14:22:44 -0700123static atomic_long_t unix_nr_socks;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125
Eric Dumazet7123aaa2012-06-08 05:03:21 +0000126static struct hlist_head *unix_sockets_unbound(void *addr)
127{
128 unsigned long hash = (unsigned long)addr;
129
130 hash ^= hash >> 16;
131 hash ^= hash >> 8;
132 hash %= UNIX_HASH_SIZE;
133 return &unix_socket_table[UNIX_HASH_SIZE + hash];
134}
135
136#define UNIX_ABSTRACT(sk) (unix_sk(sk)->addr->hash < UNIX_HASH_SIZE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700138#ifdef CONFIG_SECURITY_NETWORK
Catherine Zhangdc49c1f2006-08-02 14:12:06 -0700139static void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb)
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700140{
Stephen Smalley37a9a8d2015-06-10 08:44:59 -0400141 UNIXCB(skb).secid = scm->secid;
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700142}
143
144static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb)
145{
Stephen Smalley37a9a8d2015-06-10 08:44:59 -0400146 scm->secid = UNIXCB(skb).secid;
147}
148
149static inline bool unix_secdata_eq(struct scm_cookie *scm, struct sk_buff *skb)
150{
151 return (scm->secid == UNIXCB(skb).secid);
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700152}
153#else
Catherine Zhangdc49c1f2006-08-02 14:12:06 -0700154static inline void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb)
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700155{ }
156
157static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb)
158{ }
Stephen Smalley37a9a8d2015-06-10 08:44:59 -0400159
160static inline bool unix_secdata_eq(struct scm_cookie *scm, struct sk_buff *skb)
161{
162 return true;
163}
Catherine Zhang877ce7c2006-06-29 12:27:47 -0700164#endif /* CONFIG_SECURITY_NETWORK */
165
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166/*
167 * SMP locking strategy:
David S. Millerfbe9cc42005-12-13 23:26:29 -0800168 * hash table is protected with spinlock unix_table_lock
Stephen Hemminger663717f2010-02-18 14:12:06 -0800169 * each socket state is protected by separate spin lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700170 */
171
Eric Dumazet95c96172012-04-15 05:58:06 +0000172static inline unsigned int unix_hash_fold(__wsum n)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700173{
Anton Blanchard0a134042014-03-05 14:29:58 +1100174 unsigned int hash = (__force unsigned int)csum_fold(n);
Eric Dumazet95c96172012-04-15 05:58:06 +0000175
Linus Torvalds1da177e2005-04-16 15:20:36 -0700176 hash ^= hash>>8;
177 return hash&(UNIX_HASH_SIZE-1);
178}
179
180#define unix_peer(sk) (unix_sk(sk)->peer)
181
182static inline int unix_our_peer(struct sock *sk, struct sock *osk)
183{
184 return unix_peer(osk) == sk;
185}
186
187static inline int unix_may_send(struct sock *sk, struct sock *osk)
188{
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800189 return unix_peer(osk) == NULL || unix_our_peer(sk, osk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190}
191
Rainer Weikusat3c734192008-06-17 22:28:05 -0700192static inline int unix_recvq_full(struct sock const *sk)
193{
194 return skb_queue_len(&sk->sk_receive_queue) > sk->sk_max_ack_backlog;
195}
196
Pavel Emelyanovfa7ff562011-12-15 02:44:03 +0000197struct sock *unix_peer_get(struct sock *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198{
199 struct sock *peer;
200
David S. Miller1c92b4e2007-05-31 13:24:26 -0700201 unix_state_lock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202 peer = unix_peer(s);
203 if (peer)
204 sock_hold(peer);
David S. Miller1c92b4e2007-05-31 13:24:26 -0700205 unix_state_unlock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206 return peer;
207}
Pavel Emelyanovfa7ff562011-12-15 02:44:03 +0000208EXPORT_SYMBOL_GPL(unix_peer_get);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209
210static inline void unix_release_addr(struct unix_address *addr)
211{
Reshetova, Elena8c9814b2017-06-30 13:08:05 +0300212 if (refcount_dec_and_test(&addr->refcnt))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213 kfree(addr);
214}
215
216/*
217 * Check unix socket name:
218 * - should be not zero length.
219 * - if started by not zero, should be NULL terminated (FS object)
220 * - if started by zero, it is abstract name.
221 */
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +0900222
Eric Dumazet95c96172012-04-15 05:58:06 +0000223static int unix_mkname(struct sockaddr_un *sunaddr, int len, unsigned int *hashp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224{
Kyeongdon Kim33c43682018-10-16 14:57:26 +0900225 *hashp = 0;
226
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227 if (len <= sizeof(short) || len > sizeof(*sunaddr))
228 return -EINVAL;
229 if (!sunaddr || sunaddr->sun_family != AF_UNIX)
230 return -EINVAL;
231 if (sunaddr->sun_path[0]) {
232 /*
233 * This may look like an off by one error but it is a bit more
234 * subtle. 108 is the longest valid AF_UNIX path for a binding.
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300235 * sun_path[108] doesn't as such exist. However in kernel space
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236 * we are guaranteed that it is a valid memory location in our
237 * kernel address buffer.
238 */
Jianjun Konge27dfce2008-11-01 21:38:31 -0700239 ((char *)sunaddr)[len] = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240 len = strlen(sunaddr->sun_path)+1+sizeof(short);
241 return len;
242 }
243
Joe Perches07f07572008-11-19 15:44:53 -0800244 *hashp = unix_hash_fold(csum_partial(sunaddr, len, 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245 return len;
246}
247
248static void __unix_remove_socket(struct sock *sk)
249{
250 sk_del_node_init(sk);
251}
252
253static void __unix_insert_socket(struct hlist_head *list, struct sock *sk)
254{
Ilpo Järvinen547b7922008-07-25 21:43:18 -0700255 WARN_ON(!sk_unhashed(sk));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256 sk_add_node(sk, list);
257}
258
259static inline void unix_remove_socket(struct sock *sk)
260{
David S. Millerfbe9cc42005-12-13 23:26:29 -0800261 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262 __unix_remove_socket(sk);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800263 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264}
265
266static inline void unix_insert_socket(struct hlist_head *list, struct sock *sk)
267{
David S. Millerfbe9cc42005-12-13 23:26:29 -0800268 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 __unix_insert_socket(list, sk);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800270 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271}
272
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800273static struct sock *__unix_find_socket_byname(struct net *net,
274 struct sockaddr_un *sunname,
Eric Dumazet95c96172012-04-15 05:58:06 +0000275 int len, int type, unsigned int hash)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276{
277 struct sock *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278
Sasha Levinb67bfe02013-02-27 17:06:00 -0800279 sk_for_each(s, &unix_socket_table[hash ^ type]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 struct unix_sock *u = unix_sk(s);
281
YOSHIFUJI Hideaki878628f2008-03-26 03:57:35 +0900282 if (!net_eq(sock_net(s), net))
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800283 continue;
284
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285 if (u->addr->len == len &&
286 !memcmp(u->addr->name, sunname, len))
287 goto found;
288 }
289 s = NULL;
290found:
291 return s;
292}
293
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800294static inline struct sock *unix_find_socket_byname(struct net *net,
295 struct sockaddr_un *sunname,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 int len, int type,
Eric Dumazet95c96172012-04-15 05:58:06 +0000297 unsigned int hash)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298{
299 struct sock *s;
300
David S. Millerfbe9cc42005-12-13 23:26:29 -0800301 spin_lock(&unix_table_lock);
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800302 s = __unix_find_socket_byname(net, sunname, len, type, hash);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700303 if (s)
304 sock_hold(s);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800305 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306 return s;
307}
308
Eric W. Biederman6616f782010-06-13 03:35:48 +0000309static struct sock *unix_find_socket_byinode(struct inode *i)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310{
311 struct sock *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312
David S. Millerfbe9cc42005-12-13 23:26:29 -0800313 spin_lock(&unix_table_lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -0800314 sk_for_each(s,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315 &unix_socket_table[i->i_ino & (UNIX_HASH_SIZE - 1)]) {
Al Viro40ffe672012-03-14 21:54:32 -0400316 struct dentry *dentry = unix_sk(s)->path.dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317
Miklos Szeredibeef5122016-12-16 11:02:53 +0100318 if (dentry && d_backing_inode(dentry) == i) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319 sock_hold(s);
320 goto found;
321 }
322 }
323 s = NULL;
324found:
David S. Millerfbe9cc42005-12-13 23:26:29 -0800325 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326 return s;
327}
328
Rainer Weikusat7d267272015-11-20 22:07:23 +0000329/* Support code for asymmetrically connected dgram sockets
330 *
331 * If a datagram socket is connected to a socket not itself connected
332 * to the first socket (eg, /dev/log), clients may only enqueue more
333 * messages if the present receive queue of the server socket is not
334 * "too large". This means there's a second writeability condition
335 * poll and sendmsg need to test. The dgram recv code will do a wake
336 * up on the peer_wait wait queue of a socket upon reception of a
337 * datagram which needs to be propagated to sleeping would-be writers
338 * since these might not have sent anything so far. This can't be
339 * accomplished via poll_wait because the lifetime of the server
340 * socket might be less than that of its clients if these break their
341 * association with it or if the server socket is closed while clients
342 * are still connected to it and there's no way to inform "a polling
343 * implementation" that it should let go of a certain wait queue
344 *
Ingo Molnarac6424b2017-06-20 12:06:13 +0200345 * In order to propagate a wake up, a wait_queue_entry_t of the client
Rainer Weikusat7d267272015-11-20 22:07:23 +0000346 * socket is enqueued on the peer_wait queue of the server socket
347 * whose wake function does a wake_up on the ordinary client socket
348 * wait queue. This connection is established whenever a write (or
349 * poll for write) hit the flow control condition and broken when the
350 * association to the server socket is dissolved or after a wake up
351 * was relayed.
352 */
353
Ingo Molnarac6424b2017-06-20 12:06:13 +0200354static int unix_dgram_peer_wake_relay(wait_queue_entry_t *q, unsigned mode, int flags,
Rainer Weikusat7d267272015-11-20 22:07:23 +0000355 void *key)
356{
357 struct unix_sock *u;
358 wait_queue_head_t *u_sleep;
359
360 u = container_of(q, struct unix_sock, peer_wake);
361
362 __remove_wait_queue(&unix_sk(u->peer_wake.private)->peer_wait,
363 q);
364 u->peer_wake.private = NULL;
365
366 /* relaying can only happen while the wq still exists */
367 u_sleep = sk_sleep(&u->sk);
368 if (u_sleep)
Al Viro3ad6f932017-07-03 20:14:56 -0400369 wake_up_interruptible_poll(u_sleep, key_to_poll(key));
Rainer Weikusat7d267272015-11-20 22:07:23 +0000370
371 return 0;
372}
373
374static int unix_dgram_peer_wake_connect(struct sock *sk, struct sock *other)
375{
376 struct unix_sock *u, *u_other;
377 int rc;
378
379 u = unix_sk(sk);
380 u_other = unix_sk(other);
381 rc = 0;
382 spin_lock(&u_other->peer_wait.lock);
383
384 if (!u->peer_wake.private) {
385 u->peer_wake.private = other;
386 __add_wait_queue(&u_other->peer_wait, &u->peer_wake);
387
388 rc = 1;
389 }
390
391 spin_unlock(&u_other->peer_wait.lock);
392 return rc;
393}
394
395static void unix_dgram_peer_wake_disconnect(struct sock *sk,
396 struct sock *other)
397{
398 struct unix_sock *u, *u_other;
399
400 u = unix_sk(sk);
401 u_other = unix_sk(other);
402 spin_lock(&u_other->peer_wait.lock);
403
404 if (u->peer_wake.private == other) {
405 __remove_wait_queue(&u_other->peer_wait, &u->peer_wake);
406 u->peer_wake.private = NULL;
407 }
408
409 spin_unlock(&u_other->peer_wait.lock);
410}
411
412static void unix_dgram_peer_wake_disconnect_wakeup(struct sock *sk,
413 struct sock *other)
414{
415 unix_dgram_peer_wake_disconnect(sk, other);
416 wake_up_interruptible_poll(sk_sleep(sk),
Linus Torvaldsa9a08842018-02-11 14:34:03 -0800417 EPOLLOUT |
418 EPOLLWRNORM |
419 EPOLLWRBAND);
Rainer Weikusat7d267272015-11-20 22:07:23 +0000420}
421
422/* preconditions:
423 * - unix_peer(sk) == other
424 * - association is stable
425 */
426static int unix_dgram_peer_wake_me(struct sock *sk, struct sock *other)
427{
428 int connected;
429
430 connected = unix_dgram_peer_wake_connect(sk, other);
431
Jason Baron51f7e952018-08-03 17:24:53 -0400432 /* If other is SOCK_DEAD, we want to make sure we signal
433 * POLLOUT, such that a subsequent write() can get a
434 * -ECONNREFUSED. Otherwise, if we haven't queued any skbs
435 * to other and its full, we will hang waiting for POLLOUT.
436 */
437 if (unix_recvq_full(other) && !sock_flag(other, SOCK_DEAD))
Rainer Weikusat7d267272015-11-20 22:07:23 +0000438 return 1;
439
440 if (connected)
441 unix_dgram_peer_wake_disconnect(sk, other);
442
443 return 0;
444}
445
Eric Dumazet1586a582015-10-23 10:59:16 -0700446static int unix_writable(const struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447{
Eric Dumazet1586a582015-10-23 10:59:16 -0700448 return sk->sk_state != TCP_LISTEN &&
Reshetova, Elena14afee42017-06-30 13:08:00 +0300449 (refcount_read(&sk->sk_wmem_alloc) << 2) <= sk->sk_sndbuf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450}
451
452static void unix_write_space(struct sock *sk)
453{
Eric Dumazet43815482010-04-29 11:01:49 +0000454 struct socket_wq *wq;
455
456 rcu_read_lock();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457 if (unix_writable(sk)) {
Eric Dumazet43815482010-04-29 11:01:49 +0000458 wq = rcu_dereference(sk->sk_wq);
Herbert Xu1ce0bf52015-11-26 13:55:39 +0800459 if (skwq_has_sleeper(wq))
Eric Dumazet67426b72010-10-29 20:44:44 +0000460 wake_up_interruptible_sync_poll(&wq->wait,
Linus Torvaldsa9a08842018-02-11 14:34:03 -0800461 EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND);
Pavel Emelyanov8d8ad9d2007-11-26 20:10:50 +0800462 sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463 }
Eric Dumazet43815482010-04-29 11:01:49 +0000464 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700465}
466
467/* When dgram socket disconnects (or changes its peer), we clear its receive
468 * queue of packets arrived from previous peer. First, it allows to do
469 * flow control based only on wmem_alloc; second, sk connected to peer
470 * may receive messages only from that peer. */
471static void unix_dgram_disconnected(struct sock *sk, struct sock *other)
472{
David S. Millerb03efcf2005-07-08 14:57:23 -0700473 if (!skb_queue_empty(&sk->sk_receive_queue)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700474 skb_queue_purge(&sk->sk_receive_queue);
475 wake_up_interruptible_all(&unix_sk(sk)->peer_wait);
476
477 /* If one link of bidirectional dgram pipe is disconnected,
478 * we signal error. Messages are lost. Do not make this,
479 * when peer was not connected to us.
480 */
481 if (!sock_flag(other, SOCK_DEAD) && unix_peer(other) == sk) {
482 other->sk_err = ECONNRESET;
483 other->sk_error_report(other);
484 }
485 }
486}
487
488static void unix_sock_destructor(struct sock *sk)
489{
490 struct unix_sock *u = unix_sk(sk);
491
492 skb_queue_purge(&sk->sk_receive_queue);
493
Reshetova, Elena14afee42017-06-30 13:08:00 +0300494 WARN_ON(refcount_read(&sk->sk_wmem_alloc));
Ilpo Järvinen547b7922008-07-25 21:43:18 -0700495 WARN_ON(!sk_unhashed(sk));
496 WARN_ON(sk->sk_socket);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497 if (!sock_flag(sk, SOCK_DEAD)) {
wangweidong5cc208b2013-12-06 18:03:36 +0800498 pr_info("Attempt to release alive unix socket: %p\n", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499 return;
500 }
501
502 if (u->addr)
503 unix_release_addr(u->addr);
504
Eric Dumazet518de9b2010-10-26 14:22:44 -0700505 atomic_long_dec(&unix_nr_socks);
David S. Miller6f756a82008-11-23 17:34:03 -0800506 local_bh_disable();
Eric Dumazeta8076d82008-11-17 02:38:49 -0800507 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
David S. Miller6f756a82008-11-23 17:34:03 -0800508 local_bh_enable();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509#ifdef UNIX_REFCNT_DEBUG
wangweidong5cc208b2013-12-06 18:03:36 +0800510 pr_debug("UNIX %p is destroyed, %ld are still alive.\n", sk,
Eric Dumazet518de9b2010-10-26 14:22:44 -0700511 atomic_long_read(&unix_nr_socks));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512#endif
513}
514
Paul Mooreded34e02013-03-25 03:18:33 +0000515static void unix_release_sock(struct sock *sk, int embrion)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700516{
517 struct unix_sock *u = unix_sk(sk);
Al Viro40ffe672012-03-14 21:54:32 -0400518 struct path path;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700519 struct sock *skpair;
520 struct sk_buff *skb;
521 int state;
522
523 unix_remove_socket(sk);
524
525 /* Clear state */
David S. Miller1c92b4e2007-05-31 13:24:26 -0700526 unix_state_lock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 sock_orphan(sk);
528 sk->sk_shutdown = SHUTDOWN_MASK;
Al Viro40ffe672012-03-14 21:54:32 -0400529 path = u->path;
530 u->path.dentry = NULL;
531 u->path.mnt = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532 state = sk->sk_state;
533 sk->sk_state = TCP_CLOSE;
David S. Miller1c92b4e2007-05-31 13:24:26 -0700534 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535
536 wake_up_interruptible_all(&u->peer_wait);
537
Jianjun Konge27dfce2008-11-01 21:38:31 -0700538 skpair = unix_peer(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539
Jianjun Konge27dfce2008-11-01 21:38:31 -0700540 if (skpair != NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) {
David S. Miller1c92b4e2007-05-31 13:24:26 -0700542 unix_state_lock(skpair);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543 /* No more writes */
544 skpair->sk_shutdown = SHUTDOWN_MASK;
545 if (!skb_queue_empty(&sk->sk_receive_queue) || embrion)
546 skpair->sk_err = ECONNRESET;
David S. Miller1c92b4e2007-05-31 13:24:26 -0700547 unix_state_unlock(skpair);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 skpair->sk_state_change(skpair);
Pavel Emelyanov8d8ad9d2007-11-26 20:10:50 +0800549 sk_wake_async(skpair, SOCK_WAKE_WAITD, POLL_HUP);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 }
Rainer Weikusat7d267272015-11-20 22:07:23 +0000551
552 unix_dgram_peer_wake_disconnect(sk, skpair);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 sock_put(skpair); /* It may now die */
554 unix_peer(sk) = NULL;
555 }
556
557 /* Try to flush out this socket. Throw out buffers at least */
558
559 while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
Jianjun Konge27dfce2008-11-01 21:38:31 -0700560 if (state == TCP_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561 unix_release_sock(skb->sk, 1);
562 /* passed fds are erased in the kfree_skb hook */
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +0100563 UNIXCB(skb).consumed = skb->len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564 kfree_skb(skb);
565 }
566
Al Viro40ffe672012-03-14 21:54:32 -0400567 if (path.dentry)
568 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569
570 sock_put(sk);
571
572 /* ---- Socket is dead now and most probably destroyed ---- */
573
574 /*
Alan Coxe04dae82012-09-17 00:52:41 +0000575 * Fixme: BSD difference: In BSD all sockets connected to us get
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576 * ECONNRESET and we die on the spot. In Linux we behave
577 * like files and pipes do and wait for the last
578 * dereference.
579 *
580 * Can't we simply set sock->err?
581 *
582 * What the above comment does talk about? --ANK(980817)
583 */
584
Pavel Emelyanov9305cfa2007-11-10 22:06:01 -0800585 if (unix_tot_inflight)
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +0900586 unix_gc(); /* Garbage collect fds */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587}
588
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000589static void init_peercred(struct sock *sk)
590{
591 put_pid(sk->sk_peer_pid);
592 if (sk->sk_peer_cred)
593 put_cred(sk->sk_peer_cred);
594 sk->sk_peer_pid = get_pid(task_tgid(current));
595 sk->sk_peer_cred = get_current_cred();
596}
597
598static void copy_peercred(struct sock *sk, struct sock *peersk)
599{
600 put_pid(sk->sk_peer_pid);
601 if (sk->sk_peer_cred)
602 put_cred(sk->sk_peer_cred);
603 sk->sk_peer_pid = get_pid(peersk->sk_peer_pid);
604 sk->sk_peer_cred = get_cred(peersk->sk_peer_cred);
605}
606
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607static int unix_listen(struct socket *sock, int backlog)
608{
609 int err;
610 struct sock *sk = sock->sk;
611 struct unix_sock *u = unix_sk(sk);
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000612 struct pid *old_pid = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700613
614 err = -EOPNOTSUPP;
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800615 if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
616 goto out; /* Only stream/seqpacket sockets accept */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617 err = -EINVAL;
618 if (!u->addr)
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800619 goto out; /* No listens on an unbound socket */
David S. Miller1c92b4e2007-05-31 13:24:26 -0700620 unix_state_lock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621 if (sk->sk_state != TCP_CLOSE && sk->sk_state != TCP_LISTEN)
622 goto out_unlock;
623 if (backlog > sk->sk_max_ack_backlog)
624 wake_up_interruptible_all(&u->peer_wait);
625 sk->sk_max_ack_backlog = backlog;
626 sk->sk_state = TCP_LISTEN;
627 /* set credentials so connect can copy them */
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000628 init_peercred(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629 err = 0;
630
631out_unlock:
David S. Miller1c92b4e2007-05-31 13:24:26 -0700632 unix_state_unlock(sk);
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000633 put_pid(old_pid);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700634out:
635 return err;
636}
637
638static int unix_release(struct socket *);
639static int unix_bind(struct socket *, struct sockaddr *, int);
640static int unix_stream_connect(struct socket *, struct sockaddr *,
641 int addr_len, int flags);
642static int unix_socketpair(struct socket *, struct socket *);
David Howellscdfbabf2017-03-09 08:09:05 +0000643static int unix_accept(struct socket *, struct socket *, int, bool);
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100644static int unix_getname(struct socket *, struct sockaddr *, int);
Linus Torvaldsa11e1d42018-06-28 09:43:44 -0700645static __poll_t unix_poll(struct file *, struct socket *, poll_table *);
646static __poll_t unix_dgram_poll(struct file *, struct socket *,
647 poll_table *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648static int unix_ioctl(struct socket *, unsigned int, unsigned long);
Arnd Bergmann5f6beb92019-06-03 22:03:44 +0200649#ifdef CONFIG_COMPAT
650static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
651#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700652static int unix_shutdown(struct socket *, int);
Ying Xue1b784142015-03-02 15:37:48 +0800653static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);
654static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, int);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +0200655static ssize_t unix_stream_sendpage(struct socket *, struct page *, int offset,
656 size_t size, int flags);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +0200657static ssize_t unix_stream_splice_read(struct socket *, loff_t *ppos,
658 struct pipe_inode_info *, size_t size,
659 unsigned int flags);
Ying Xue1b784142015-03-02 15:37:48 +0800660static int unix_dgram_sendmsg(struct socket *, struct msghdr *, size_t);
661static int unix_dgram_recvmsg(struct socket *, struct msghdr *, size_t, int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662static int unix_dgram_connect(struct socket *, struct sockaddr *,
663 int, int);
Ying Xue1b784142015-03-02 15:37:48 +0800664static int unix_seqpacket_sendmsg(struct socket *, struct msghdr *, size_t);
665static int unix_seqpacket_recvmsg(struct socket *, struct msghdr *, size_t,
666 int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667
Sasha Levin12663bf2013-12-07 17:26:27 -0500668static int unix_set_peek_off(struct sock *sk, int val)
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000669{
670 struct unix_sock *u = unix_sk(sk);
671
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700672 if (mutex_lock_interruptible(&u->iolock))
Sasha Levin12663bf2013-12-07 17:26:27 -0500673 return -EINTR;
674
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000675 sk->sk_peek_off = val;
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700676 mutex_unlock(&u->iolock);
Sasha Levin12663bf2013-12-07 17:26:27 -0500677
678 return 0;
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000679}
680
681
Eric Dumazet90ddc4f2005-12-22 12:49:22 -0800682static const struct proto_ops unix_stream_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683 .family = PF_UNIX,
684 .owner = THIS_MODULE,
685 .release = unix_release,
686 .bind = unix_bind,
687 .connect = unix_stream_connect,
688 .socketpair = unix_socketpair,
689 .accept = unix_accept,
690 .getname = unix_getname,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -0700691 .poll = unix_poll,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 .ioctl = unix_ioctl,
Arnd Bergmann5f6beb92019-06-03 22:03:44 +0200693#ifdef CONFIG_COMPAT
694 .compat_ioctl = unix_compat_ioctl,
695#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696 .listen = unix_listen,
697 .shutdown = unix_shutdown,
698 .setsockopt = sock_no_setsockopt,
699 .getsockopt = sock_no_getsockopt,
700 .sendmsg = unix_stream_sendmsg,
701 .recvmsg = unix_stream_recvmsg,
702 .mmap = sock_no_mmap,
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +0200703 .sendpage = unix_stream_sendpage,
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +0200704 .splice_read = unix_stream_splice_read,
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +0000705 .set_peek_off = unix_set_peek_off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706};
707
Eric Dumazet90ddc4f2005-12-22 12:49:22 -0800708static const struct proto_ops unix_dgram_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709 .family = PF_UNIX,
710 .owner = THIS_MODULE,
711 .release = unix_release,
712 .bind = unix_bind,
713 .connect = unix_dgram_connect,
714 .socketpair = unix_socketpair,
715 .accept = sock_no_accept,
716 .getname = unix_getname,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -0700717 .poll = unix_dgram_poll,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 .ioctl = unix_ioctl,
Arnd Bergmann5f6beb92019-06-03 22:03:44 +0200719#ifdef CONFIG_COMPAT
720 .compat_ioctl = unix_compat_ioctl,
721#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722 .listen = sock_no_listen,
723 .shutdown = unix_shutdown,
724 .setsockopt = sock_no_setsockopt,
725 .getsockopt = sock_no_getsockopt,
726 .sendmsg = unix_dgram_sendmsg,
727 .recvmsg = unix_dgram_recvmsg,
728 .mmap = sock_no_mmap,
729 .sendpage = sock_no_sendpage,
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000730 .set_peek_off = unix_set_peek_off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700731};
732
Eric Dumazet90ddc4f2005-12-22 12:49:22 -0800733static const struct proto_ops unix_seqpacket_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 .family = PF_UNIX,
735 .owner = THIS_MODULE,
736 .release = unix_release,
737 .bind = unix_bind,
738 .connect = unix_stream_connect,
739 .socketpair = unix_socketpair,
740 .accept = unix_accept,
741 .getname = unix_getname,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -0700742 .poll = unix_dgram_poll,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 .ioctl = unix_ioctl,
Arnd Bergmann5f6beb92019-06-03 22:03:44 +0200744#ifdef CONFIG_COMPAT
745 .compat_ioctl = unix_compat_ioctl,
746#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 .listen = unix_listen,
748 .shutdown = unix_shutdown,
749 .setsockopt = sock_no_setsockopt,
750 .getsockopt = sock_no_getsockopt,
751 .sendmsg = unix_seqpacket_sendmsg,
Eric W. Biedermana05d2ad2011-04-24 01:54:57 +0000752 .recvmsg = unix_seqpacket_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753 .mmap = sock_no_mmap,
754 .sendpage = sock_no_sendpage,
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000755 .set_peek_off = unix_set_peek_off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756};
757
758static struct proto unix_proto = {
Eric Dumazet248969a2008-11-17 00:00:30 -0800759 .name = "UNIX",
760 .owner = THIS_MODULE,
Eric Dumazet248969a2008-11-17 00:00:30 -0800761 .obj_size = sizeof(struct unix_sock),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762};
763
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500764static struct sock *unix_create1(struct net *net, struct socket *sock, int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765{
766 struct sock *sk = NULL;
767 struct unix_sock *u;
768
Eric Dumazet518de9b2010-10-26 14:22:44 -0700769 atomic_long_inc(&unix_nr_socks);
770 if (atomic_long_read(&unix_nr_socks) > 2 * get_max_files())
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 goto out;
772
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500773 sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto, kern);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700774 if (!sk)
775 goto out;
776
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800777 sock_init_data(sock, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700778
Vladimir Davydov3aa97992016-07-26 15:24:36 -0700779 sk->sk_allocation = GFP_KERNEL_ACCOUNT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780 sk->sk_write_space = unix_write_space;
Denis V. Luneva0a53c82007-12-11 04:19:17 -0800781 sk->sk_max_ack_backlog = net->unx.sysctl_max_dgram_qlen;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 sk->sk_destruct = unix_sock_destructor;
783 u = unix_sk(sk);
Al Viro40ffe672012-03-14 21:54:32 -0400784 u->path.dentry = NULL;
785 u->path.mnt = NULL;
Benjamin LaHaisefd19f322006-01-03 14:10:46 -0800786 spin_lock_init(&u->lock);
Al Viro516e0cc2008-07-26 00:39:17 -0400787 atomic_long_set(&u->inflight, 0);
Miklos Szeredi1fd05ba2007-07-11 14:22:39 -0700788 INIT_LIST_HEAD(&u->link);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700789 mutex_init(&u->iolock); /* single task reading lock */
790 mutex_init(&u->bindlock); /* single task binding lock */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791 init_waitqueue_head(&u->peer_wait);
Rainer Weikusat7d267272015-11-20 22:07:23 +0000792 init_waitqueue_func_entry(&u->peer_wake, unix_dgram_peer_wake_relay);
Eric Dumazet7123aaa2012-06-08 05:03:21 +0000793 unix_insert_socket(unix_sockets_unbound(sk), sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794out:
Pavel Emelyanov284b3272007-11-10 22:08:30 -0800795 if (sk == NULL)
Eric Dumazet518de9b2010-10-26 14:22:44 -0700796 atomic_long_dec(&unix_nr_socks);
Eric Dumazet920de802008-11-24 00:09:29 -0800797 else {
798 local_bh_disable();
Eric Dumazeta8076d82008-11-17 02:38:49 -0800799 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
Eric Dumazet920de802008-11-24 00:09:29 -0800800 local_bh_enable();
801 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 return sk;
803}
804
Eric Paris3f378b62009-11-05 22:18:14 -0800805static int unix_create(struct net *net, struct socket *sock, int protocol,
806 int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807{
808 if (protocol && protocol != PF_UNIX)
809 return -EPROTONOSUPPORT;
810
811 sock->state = SS_UNCONNECTED;
812
813 switch (sock->type) {
814 case SOCK_STREAM:
815 sock->ops = &unix_stream_ops;
816 break;
817 /*
818 * Believe it or not BSD has AF_UNIX, SOCK_RAW though
819 * nothing uses it.
820 */
821 case SOCK_RAW:
Jianjun Konge27dfce2008-11-01 21:38:31 -0700822 sock->type = SOCK_DGRAM;
Gustavo A. R. Silva110af3a2017-10-20 12:05:30 -0500823 /* fall through */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824 case SOCK_DGRAM:
825 sock->ops = &unix_dgram_ops;
826 break;
827 case SOCK_SEQPACKET:
828 sock->ops = &unix_seqpacket_ops;
829 break;
830 default:
831 return -ESOCKTNOSUPPORT;
832 }
833
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500834 return unix_create1(net, sock, kern) ? 0 : -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835}
836
837static int unix_release(struct socket *sock)
838{
839 struct sock *sk = sock->sk;
840
841 if (!sk)
842 return 0;
843
Paul Mooreded34e02013-03-25 03:18:33 +0000844 unix_release_sock(sk, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845 sock->sk = NULL;
846
Paul Mooreded34e02013-03-25 03:18:33 +0000847 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848}
849
850static int unix_autobind(struct socket *sock)
851{
852 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +0900853 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 struct unix_sock *u = unix_sk(sk);
855 static u32 ordernum = 1;
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800856 struct unix_address *addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700857 int err;
Tetsuo Handa8df73ff2010-09-04 01:34:28 +0000858 unsigned int retries = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700860 err = mutex_lock_interruptible(&u->bindlock);
Sasha Levin37ab4fa2013-12-13 10:54:22 -0500861 if (err)
862 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863
864 err = 0;
865 if (u->addr)
866 goto out;
867
868 err = -ENOMEM;
Panagiotis Issaris0da974f2006-07-21 14:51:30 -0700869 addr = kzalloc(sizeof(*addr) + sizeof(short) + 16, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870 if (!addr)
871 goto out;
872
Linus Torvalds1da177e2005-04-16 15:20:36 -0700873 addr->name->sun_family = AF_UNIX;
Reshetova, Elena8c9814b2017-06-30 13:08:05 +0300874 refcount_set(&addr->refcnt, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875
876retry:
877 addr->len = sprintf(addr->name->sun_path+1, "%05x", ordernum) + 1 + sizeof(short);
Joe Perches07f07572008-11-19 15:44:53 -0800878 addr->hash = unix_hash_fold(csum_partial(addr->name, addr->len, 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700879
David S. Millerfbe9cc42005-12-13 23:26:29 -0800880 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700881 ordernum = (ordernum+1)&0xFFFFF;
882
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800883 if (__unix_find_socket_byname(net, addr->name, addr->len, sock->type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700884 addr->hash)) {
David S. Millerfbe9cc42005-12-13 23:26:29 -0800885 spin_unlock(&unix_table_lock);
Tetsuo Handa8df73ff2010-09-04 01:34:28 +0000886 /*
887 * __unix_find_socket_byname() may take long time if many names
888 * are already in use.
889 */
890 cond_resched();
891 /* Give up if all names seems to be in use. */
892 if (retries++ == 0xFFFFF) {
893 err = -ENOSPC;
894 kfree(addr);
895 goto out;
896 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897 goto retry;
898 }
899 addr->hash ^= sk->sk_type;
900
901 __unix_remove_socket(sk);
Al Viroae3b5642019-02-15 20:09:35 +0000902 smp_store_release(&u->addr, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903 __unix_insert_socket(&unix_socket_table[addr->hash], sk);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800904 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700905 err = 0;
906
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700907out: mutex_unlock(&u->bindlock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908 return err;
909}
910
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800911static struct sock *unix_find_other(struct net *net,
912 struct sockaddr_un *sunname, int len,
Eric Dumazet95c96172012-04-15 05:58:06 +0000913 int type, unsigned int hash, int *error)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914{
915 struct sock *u;
Al Viro421748e2008-08-02 01:04:36 -0400916 struct path path;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917 int err = 0;
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +0900918
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 if (sunname->sun_path[0]) {
Al Viro421748e2008-08-02 01:04:36 -0400920 struct inode *inode;
921 err = kern_path(sunname->sun_path, LOOKUP_FOLLOW, &path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700922 if (err)
923 goto fail;
Miklos Szeredibeef5122016-12-16 11:02:53 +0100924 inode = d_backing_inode(path.dentry);
Al Viro421748e2008-08-02 01:04:36 -0400925 err = inode_permission(inode, MAY_WRITE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926 if (err)
927 goto put_fail;
928
929 err = -ECONNREFUSED;
Al Viro421748e2008-08-02 01:04:36 -0400930 if (!S_ISSOCK(inode->i_mode))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931 goto put_fail;
Eric W. Biederman6616f782010-06-13 03:35:48 +0000932 u = unix_find_socket_byinode(inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933 if (!u)
934 goto put_fail;
935
936 if (u->sk_type == type)
Al Viro68ac1232012-03-15 08:21:57 -0400937 touch_atime(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938
Al Viro421748e2008-08-02 01:04:36 -0400939 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700940
Jianjun Konge27dfce2008-11-01 21:38:31 -0700941 err = -EPROTOTYPE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700942 if (u->sk_type != type) {
943 sock_put(u);
944 goto fail;
945 }
946 } else {
947 err = -ECONNREFUSED;
Jianjun Konge27dfce2008-11-01 21:38:31 -0700948 u = unix_find_socket_byname(net, sunname, len, type, hash);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700949 if (u) {
950 struct dentry *dentry;
Al Viro40ffe672012-03-14 21:54:32 -0400951 dentry = unix_sk(u)->path.dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952 if (dentry)
Al Viro68ac1232012-03-15 08:21:57 -0400953 touch_atime(&unix_sk(u)->path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 } else
955 goto fail;
956 }
957 return u;
958
959put_fail:
Al Viro421748e2008-08-02 01:04:36 -0400960 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700961fail:
Jianjun Konge27dfce2008-11-01 21:38:31 -0700962 *error = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963 return NULL;
964}
965
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700966static int unix_mknod(const char *sun_path, umode_t mode, struct path *res)
Al Virofaf02012012-07-20 02:37:29 +0400967{
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700968 struct dentry *dentry;
969 struct path path;
970 int err = 0;
971 /*
972 * Get the parent directory, calculate the hash for last
973 * component.
974 */
975 dentry = kern_path_create(AT_FDCWD, sun_path, &path, 0);
976 err = PTR_ERR(dentry);
977 if (IS_ERR(dentry))
978 return err;
Al Virofaf02012012-07-20 02:37:29 +0400979
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700980 /*
981 * All right, let's create it.
982 */
983 err = security_path_mknod(&path, dentry, mode, 0);
Al Virofaf02012012-07-20 02:37:29 +0400984 if (!err) {
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700985 err = vfs_mknod(d_inode(path.dentry), dentry, mode, 0);
Al Virofaf02012012-07-20 02:37:29 +0400986 if (!err) {
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700987 res->mnt = mntget(path.mnt);
Al Virofaf02012012-07-20 02:37:29 +0400988 res->dentry = dget(dentry);
989 }
990 }
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700991 done_path_create(&path, dentry);
Al Virofaf02012012-07-20 02:37:29 +0400992 return err;
993}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994
995static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
996{
997 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +0900998 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999 struct unix_sock *u = unix_sk(sk);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001000 struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
Al Virodae6ad82011-06-26 11:50:15 -04001001 char *sun_path = sunaddr->sun_path;
Linus Torvalds38f7bd942016-09-01 14:56:49 -07001002 int err;
Eric Dumazet95c96172012-04-15 05:58:06 +00001003 unsigned int hash;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004 struct unix_address *addr;
1005 struct hlist_head *list;
Kees Cook82fe0d22017-04-04 22:12:09 -07001006 struct path path = { };
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007
1008 err = -EINVAL;
Mateusz Jurczykdefbcf22017-06-08 11:13:36 +02001009 if (addr_len < offsetofend(struct sockaddr_un, sun_family) ||
1010 sunaddr->sun_family != AF_UNIX)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011 goto out;
1012
Jianjun Konge27dfce2008-11-01 21:38:31 -07001013 if (addr_len == sizeof(short)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014 err = unix_autobind(sock);
1015 goto out;
1016 }
1017
1018 err = unix_mkname(sunaddr, addr_len, &hash);
1019 if (err < 0)
1020 goto out;
1021 addr_len = err;
1022
WANG Cong0fb44552017-01-23 11:17:35 -08001023 if (sun_path[0]) {
1024 umode_t mode = S_IFSOCK |
1025 (SOCK_INODE(sock)->i_mode & ~current_umask());
1026 err = unix_mknod(sun_path, mode, &path);
1027 if (err) {
1028 if (err == -EEXIST)
1029 err = -EADDRINUSE;
1030 goto out;
1031 }
1032 }
1033
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001034 err = mutex_lock_interruptible(&u->bindlock);
Sasha Levin37ab4fa2013-12-13 10:54:22 -05001035 if (err)
WANG Cong0fb44552017-01-23 11:17:35 -08001036 goto out_put;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037
1038 err = -EINVAL;
1039 if (u->addr)
1040 goto out_up;
1041
1042 err = -ENOMEM;
1043 addr = kmalloc(sizeof(*addr)+addr_len, GFP_KERNEL);
1044 if (!addr)
1045 goto out_up;
1046
1047 memcpy(addr->name, sunaddr, addr_len);
1048 addr->len = addr_len;
1049 addr->hash = hash ^ sk->sk_type;
Reshetova, Elena8c9814b2017-06-30 13:08:05 +03001050 refcount_set(&addr->refcnt, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051
Linus Torvalds38f7bd942016-09-01 14:56:49 -07001052 if (sun_path[0]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 addr->hash = UNIX_HASH_SIZE;
Miklos Szeredibeef5122016-12-16 11:02:53 +01001054 hash = d_backing_inode(path.dentry)->i_ino & (UNIX_HASH_SIZE - 1);
Al Virofaf02012012-07-20 02:37:29 +04001055 spin_lock(&unix_table_lock);
Linus Torvalds38f7bd942016-09-01 14:56:49 -07001056 u->path = path;
Al Virofaf02012012-07-20 02:37:29 +04001057 list = &unix_socket_table[hash];
1058 } else {
1059 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060 err = -EADDRINUSE;
Denis V. Lunev097e66c2007-11-19 22:29:30 -08001061 if (__unix_find_socket_byname(net, sunaddr, addr_len,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001062 sk->sk_type, hash)) {
1063 unix_release_addr(addr);
1064 goto out_unlock;
1065 }
1066
1067 list = &unix_socket_table[addr->hash];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068 }
1069
1070 err = 0;
1071 __unix_remove_socket(sk);
Al Viroae3b5642019-02-15 20:09:35 +00001072 smp_store_release(&u->addr, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073 __unix_insert_socket(list, sk);
1074
1075out_unlock:
David S. Millerfbe9cc42005-12-13 23:26:29 -08001076 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077out_up:
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001078 mutex_unlock(&u->bindlock);
WANG Cong0fb44552017-01-23 11:17:35 -08001079out_put:
1080 if (err)
1081 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082out:
1083 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084}
1085
David S. Miller278a3de2007-05-31 15:19:20 -07001086static void unix_state_double_lock(struct sock *sk1, struct sock *sk2)
1087{
1088 if (unlikely(sk1 == sk2) || !sk2) {
1089 unix_state_lock(sk1);
1090 return;
1091 }
1092 if (sk1 < sk2) {
1093 unix_state_lock(sk1);
1094 unix_state_lock_nested(sk2);
1095 } else {
1096 unix_state_lock(sk2);
1097 unix_state_lock_nested(sk1);
1098 }
1099}
1100
1101static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2)
1102{
1103 if (unlikely(sk1 == sk2) || !sk2) {
1104 unix_state_unlock(sk1);
1105 return;
1106 }
1107 unix_state_unlock(sk1);
1108 unix_state_unlock(sk2);
1109}
1110
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
1112 int alen, int flags)
1113{
1114 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001115 struct net *net = sock_net(sk);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001116 struct sockaddr_un *sunaddr = (struct sockaddr_un *)addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001117 struct sock *other;
Eric Dumazet95c96172012-04-15 05:58:06 +00001118 unsigned int hash;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119 int err;
1120
Mateusz Jurczykdefbcf22017-06-08 11:13:36 +02001121 err = -EINVAL;
1122 if (alen < offsetofend(struct sockaddr, sa_family))
1123 goto out;
1124
Linus Torvalds1da177e2005-04-16 15:20:36 -07001125 if (addr->sa_family != AF_UNSPEC) {
1126 err = unix_mkname(sunaddr, alen, &hash);
1127 if (err < 0)
1128 goto out;
1129 alen = err;
1130
1131 if (test_bit(SOCK_PASSCRED, &sock->flags) &&
1132 !unix_sk(sk)->addr && (err = unix_autobind(sock)) != 0)
1133 goto out;
1134
David S. Miller278a3de2007-05-31 15:19:20 -07001135restart:
Jianjun Konge27dfce2008-11-01 21:38:31 -07001136 other = unix_find_other(net, sunaddr, alen, sock->type, hash, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137 if (!other)
1138 goto out;
1139
David S. Miller278a3de2007-05-31 15:19:20 -07001140 unix_state_double_lock(sk, other);
1141
1142 /* Apparently VFS overslept socket death. Retry. */
1143 if (sock_flag(other, SOCK_DEAD)) {
1144 unix_state_double_unlock(sk, other);
1145 sock_put(other);
1146 goto restart;
1147 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001148
1149 err = -EPERM;
1150 if (!unix_may_send(sk, other))
1151 goto out_unlock;
1152
1153 err = security_unix_may_send(sk->sk_socket, other->sk_socket);
1154 if (err)
1155 goto out_unlock;
1156
1157 } else {
1158 /*
1159 * 1003.1g breaking connected state with AF_UNSPEC
1160 */
1161 other = NULL;
David S. Miller278a3de2007-05-31 15:19:20 -07001162 unix_state_double_lock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 }
1164
1165 /*
1166 * If it was connected, reconnect.
1167 */
1168 if (unix_peer(sk)) {
1169 struct sock *old_peer = unix_peer(sk);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001170 unix_peer(sk) = other;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001171 unix_dgram_peer_wake_disconnect_wakeup(sk, old_peer);
1172
David S. Miller278a3de2007-05-31 15:19:20 -07001173 unix_state_double_unlock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174
1175 if (other != old_peer)
1176 unix_dgram_disconnected(sk, old_peer);
1177 sock_put(old_peer);
1178 } else {
Jianjun Konge27dfce2008-11-01 21:38:31 -07001179 unix_peer(sk) = other;
David S. Miller278a3de2007-05-31 15:19:20 -07001180 unix_state_double_unlock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181 }
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001182 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001183
1184out_unlock:
David S. Miller278a3de2007-05-31 15:19:20 -07001185 unix_state_double_unlock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186 sock_put(other);
1187out:
1188 return err;
1189}
1190
1191static long unix_wait_for_peer(struct sock *other, long timeo)
1192{
1193 struct unix_sock *u = unix_sk(other);
1194 int sched;
1195 DEFINE_WAIT(wait);
1196
1197 prepare_to_wait_exclusive(&u->peer_wait, &wait, TASK_INTERRUPTIBLE);
1198
1199 sched = !sock_flag(other, SOCK_DEAD) &&
1200 !(other->sk_shutdown & RCV_SHUTDOWN) &&
Rainer Weikusat3c734192008-06-17 22:28:05 -07001201 unix_recvq_full(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202
David S. Miller1c92b4e2007-05-31 13:24:26 -07001203 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204
1205 if (sched)
1206 timeo = schedule_timeout(timeo);
1207
1208 finish_wait(&u->peer_wait, &wait);
1209 return timeo;
1210}
1211
1212static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
1213 int addr_len, int flags)
1214{
Jianjun Konge27dfce2008-11-01 21:38:31 -07001215 struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001216 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001217 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001218 struct unix_sock *u = unix_sk(sk), *newu, *otheru;
1219 struct sock *newsk = NULL;
1220 struct sock *other = NULL;
1221 struct sk_buff *skb = NULL;
Eric Dumazet95c96172012-04-15 05:58:06 +00001222 unsigned int hash;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001223 int st;
1224 int err;
1225 long timeo;
1226
1227 err = unix_mkname(sunaddr, addr_len, &hash);
1228 if (err < 0)
1229 goto out;
1230 addr_len = err;
1231
Joe Perchesf64f9e72009-11-29 16:55:45 -08001232 if (test_bit(SOCK_PASSCRED, &sock->flags) && !u->addr &&
1233 (err = unix_autobind(sock)) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234 goto out;
1235
1236 timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
1237
1238 /* First of all allocate resources.
1239 If we will make it after state is locked,
1240 we will have to recheck all again in any case.
1241 */
1242
1243 err = -ENOMEM;
1244
1245 /* create new sock for complete connection */
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001246 newsk = unix_create1(sock_net(sk), NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247 if (newsk == NULL)
1248 goto out;
1249
1250 /* Allocate skb for sending to listening sock */
1251 skb = sock_wmalloc(newsk, 1, 0, GFP_KERNEL);
1252 if (skb == NULL)
1253 goto out;
1254
1255restart:
1256 /* Find listening sock. */
Denis V. Lunev097e66c2007-11-19 22:29:30 -08001257 other = unix_find_other(net, sunaddr, addr_len, sk->sk_type, hash, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 if (!other)
1259 goto out;
1260
1261 /* Latch state of peer */
David S. Miller1c92b4e2007-05-31 13:24:26 -07001262 unix_state_lock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263
1264 /* Apparently VFS overslept socket death. Retry. */
1265 if (sock_flag(other, SOCK_DEAD)) {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001266 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267 sock_put(other);
1268 goto restart;
1269 }
1270
1271 err = -ECONNREFUSED;
1272 if (other->sk_state != TCP_LISTEN)
1273 goto out_unlock;
Tomoki Sekiyama77238f22009-10-18 23:17:37 -07001274 if (other->sk_shutdown & RCV_SHUTDOWN)
1275 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276
Rainer Weikusat3c734192008-06-17 22:28:05 -07001277 if (unix_recvq_full(other)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001278 err = -EAGAIN;
1279 if (!timeo)
1280 goto out_unlock;
1281
1282 timeo = unix_wait_for_peer(other, timeo);
1283
1284 err = sock_intr_errno(timeo);
1285 if (signal_pending(current))
1286 goto out;
1287 sock_put(other);
1288 goto restart;
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001289 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290
1291 /* Latch our state.
1292
Daniel Balutae5537bf2011-03-14 15:25:33 -07001293 It is tricky place. We need to grab our state lock and cannot
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 drop lock on peer. It is dangerous because deadlock is
1295 possible. Connect to self case and simultaneous
1296 attempt to connect are eliminated by checking socket
1297 state. other is TCP_LISTEN, if sk is TCP_LISTEN we
1298 check this before attempt to grab lock.
1299
1300 Well, and we have to recheck the state after socket locked.
1301 */
1302 st = sk->sk_state;
1303
1304 switch (st) {
1305 case TCP_CLOSE:
1306 /* This is ok... continue with connect */
1307 break;
1308 case TCP_ESTABLISHED:
1309 /* Socket is already connected */
1310 err = -EISCONN;
1311 goto out_unlock;
1312 default:
1313 err = -EINVAL;
1314 goto out_unlock;
1315 }
1316
David S. Miller1c92b4e2007-05-31 13:24:26 -07001317 unix_state_lock_nested(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001318
1319 if (sk->sk_state != st) {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001320 unix_state_unlock(sk);
1321 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322 sock_put(other);
1323 goto restart;
1324 }
1325
David S. Miller3610cda2011-01-05 15:38:53 -08001326 err = security_unix_stream_connect(sk, other, newsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327 if (err) {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001328 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001329 goto out_unlock;
1330 }
1331
1332 /* The way is open! Fastly set all the necessary fields... */
1333
1334 sock_hold(sk);
1335 unix_peer(newsk) = sk;
1336 newsk->sk_state = TCP_ESTABLISHED;
1337 newsk->sk_type = sk->sk_type;
Eric W. Biederman109f6e32010-06-13 03:30:14 +00001338 init_peercred(newsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339 newu = unix_sk(newsk);
Eric Dumazeteaefd112011-02-18 03:26:36 +00001340 RCU_INIT_POINTER(newsk->sk_wq, &newu->peer_wq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001341 otheru = unix_sk(other);
1342
Al Viroae3b5642019-02-15 20:09:35 +00001343 /* copy address information from listening to new sock
1344 *
1345 * The contents of *(otheru->addr) and otheru->path
1346 * are seen fully set up here, since we have found
1347 * otheru in hash under unix_table_lock. Insertion
1348 * into the hash chain we'd found it in had been done
1349 * in an earlier critical area protected by unix_table_lock,
1350 * the same one where we'd set *(otheru->addr) contents,
1351 * as well as otheru->path and otheru->addr itself.
1352 *
1353 * Using smp_store_release() here to set newu->addr
1354 * is enough to make those stores, as well as stores
1355 * to newu->path visible to anyone who gets newu->addr
1356 * by smp_load_acquire(). IOW, the same warranties
1357 * as for unix_sock instances bound in unix_bind() or
1358 * in unix_autobind().
1359 */
Al Viro40ffe672012-03-14 21:54:32 -04001360 if (otheru->path.dentry) {
1361 path_get(&otheru->path);
1362 newu->path = otheru->path;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363 }
Al Viroae3b5642019-02-15 20:09:35 +00001364 refcount_inc(&otheru->addr->refcnt);
1365 smp_store_release(&newu->addr, otheru->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366
1367 /* Set credentials */
Eric W. Biederman109f6e32010-06-13 03:30:14 +00001368 copy_peercred(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369
Linus Torvalds1da177e2005-04-16 15:20:36 -07001370 sock->state = SS_CONNECTED;
1371 sk->sk_state = TCP_ESTABLISHED;
Benjamin LaHaise830a1e52005-12-13 23:22:32 -08001372 sock_hold(newsk);
1373
Peter Zijlstra4e857c52014-03-17 18:06:10 +01001374 smp_mb__after_atomic(); /* sock_hold() does an atomic_inc() */
Benjamin LaHaise830a1e52005-12-13 23:22:32 -08001375 unix_peer(sk) = newsk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376
David S. Miller1c92b4e2007-05-31 13:24:26 -07001377 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378
1379 /* take ten and and send info to listening sock */
1380 spin_lock(&other->sk_receive_queue.lock);
1381 __skb_queue_tail(&other->sk_receive_queue, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382 spin_unlock(&other->sk_receive_queue.lock);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001383 unix_state_unlock(other);
David S. Miller676d2362014-04-11 16:15:36 -04001384 other->sk_data_ready(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385 sock_put(other);
1386 return 0;
1387
1388out_unlock:
1389 if (other)
David S. Miller1c92b4e2007-05-31 13:24:26 -07001390 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001391
1392out:
Wei Yongjun40d44442009-02-25 00:32:45 +00001393 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394 if (newsk)
1395 unix_release_sock(newsk, 0);
1396 if (other)
1397 sock_put(other);
1398 return err;
1399}
1400
1401static int unix_socketpair(struct socket *socka, struct socket *sockb)
1402{
Jianjun Konge27dfce2008-11-01 21:38:31 -07001403 struct sock *ska = socka->sk, *skb = sockb->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404
1405 /* Join our sockets back to back */
1406 sock_hold(ska);
1407 sock_hold(skb);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001408 unix_peer(ska) = skb;
1409 unix_peer(skb) = ska;
Eric W. Biederman109f6e32010-06-13 03:30:14 +00001410 init_peercred(ska);
1411 init_peercred(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001412
1413 if (ska->sk_type != SOCK_DGRAM) {
1414 ska->sk_state = TCP_ESTABLISHED;
1415 skb->sk_state = TCP_ESTABLISHED;
1416 socka->state = SS_CONNECTED;
1417 sockb->state = SS_CONNECTED;
1418 }
1419 return 0;
1420}
1421
Daniel Borkmann90c6bd32013-10-17 22:51:31 +02001422static void unix_sock_inherit_flags(const struct socket *old,
1423 struct socket *new)
1424{
1425 if (test_bit(SOCK_PASSCRED, &old->flags))
1426 set_bit(SOCK_PASSCRED, &new->flags);
1427 if (test_bit(SOCK_PASSSEC, &old->flags))
1428 set_bit(SOCK_PASSSEC, &new->flags);
1429}
1430
David Howellscdfbabf2017-03-09 08:09:05 +00001431static int unix_accept(struct socket *sock, struct socket *newsock, int flags,
1432 bool kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433{
1434 struct sock *sk = sock->sk;
1435 struct sock *tsk;
1436 struct sk_buff *skb;
1437 int err;
1438
1439 err = -EOPNOTSUPP;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001440 if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441 goto out;
1442
1443 err = -EINVAL;
1444 if (sk->sk_state != TCP_LISTEN)
1445 goto out;
1446
1447 /* If socket state is TCP_LISTEN it cannot change (for now...),
1448 * so that no locks are necessary.
1449 */
1450
1451 skb = skb_recv_datagram(sk, 0, flags&O_NONBLOCK, &err);
1452 if (!skb) {
1453 /* This means receive shutdown. */
1454 if (err == 0)
1455 err = -EINVAL;
1456 goto out;
1457 }
1458
1459 tsk = skb->sk;
1460 skb_free_datagram(sk, skb);
1461 wake_up_interruptible(&unix_sk(sk)->peer_wait);
1462
1463 /* attach accepted sock to socket */
David S. Miller1c92b4e2007-05-31 13:24:26 -07001464 unix_state_lock(tsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 newsock->state = SS_CONNECTED;
Daniel Borkmann90c6bd32013-10-17 22:51:31 +02001466 unix_sock_inherit_flags(sock, newsock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467 sock_graft(tsk, newsock);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001468 unix_state_unlock(tsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469 return 0;
1470
1471out:
1472 return err;
1473}
1474
1475
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +01001476static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int peer)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477{
1478 struct sock *sk = sock->sk;
Al Viroae3b5642019-02-15 20:09:35 +00001479 struct unix_address *addr;
Cyrill Gorcunov13cfa972009-11-08 05:51:19 +00001480 DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, uaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 int err = 0;
1482
1483 if (peer) {
1484 sk = unix_peer_get(sk);
1485
1486 err = -ENOTCONN;
1487 if (!sk)
1488 goto out;
1489 err = 0;
1490 } else {
1491 sock_hold(sk);
1492 }
1493
Al Viroae3b5642019-02-15 20:09:35 +00001494 addr = smp_load_acquire(&unix_sk(sk)->addr);
1495 if (!addr) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 sunaddr->sun_family = AF_UNIX;
1497 sunaddr->sun_path[0] = 0;
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +01001498 err = sizeof(short);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499 } else {
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +01001500 err = addr->len;
1501 memcpy(sunaddr, addr->name, addr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001503 sock_put(sk);
1504out:
1505 return err;
1506}
1507
David S. Millerf78a5fd2011-09-16 19:34:00 -04001508static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds)
Eric W. Biederman7361c362010-06-13 03:34:33 +00001509{
1510 int err = 0;
Eric Dumazet16e57262011-09-19 05:52:27 +00001511
David S. Millerf78a5fd2011-09-16 19:34:00 -04001512 UNIXCB(skb).pid = get_pid(scm->pid);
Eric W. Biederman6b0ee8c02013-04-03 17:28:16 +00001513 UNIXCB(skb).uid = scm->creds.uid;
1514 UNIXCB(skb).gid = scm->creds.gid;
Eric W. Biederman7361c362010-06-13 03:34:33 +00001515 UNIXCB(skb).fp = NULL;
Stephen Smalley37a9a8d2015-06-10 08:44:59 -04001516 unix_get_secdata(scm, skb);
Eric W. Biederman7361c362010-06-13 03:34:33 +00001517 if (scm->fp && send_fds)
1518 err = unix_attach_fds(scm, skb);
1519
1520 skb->destructor = unix_destruct_scm;
1521 return err;
1522}
1523
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001524static bool unix_passcred_enabled(const struct socket *sock,
1525 const struct sock *other)
1526{
1527 return test_bit(SOCK_PASSCRED, &sock->flags) ||
1528 !other->sk_socket ||
1529 test_bit(SOCK_PASSCRED, &other->sk_socket->flags);
1530}
1531
Linus Torvalds1da177e2005-04-16 15:20:36 -07001532/*
Eric Dumazet16e57262011-09-19 05:52:27 +00001533 * Some apps rely on write() giving SCM_CREDENTIALS
1534 * We include credentials if source or destination socket
1535 * asserted SOCK_PASSCRED.
1536 */
1537static void maybe_add_creds(struct sk_buff *skb, const struct socket *sock,
1538 const struct sock *other)
1539{
Eric W. Biederman6b0ee8c02013-04-03 17:28:16 +00001540 if (UNIXCB(skb).pid)
Eric Dumazet16e57262011-09-19 05:52:27 +00001541 return;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001542 if (unix_passcred_enabled(sock, other)) {
Eric Dumazet16e57262011-09-19 05:52:27 +00001543 UNIXCB(skb).pid = get_pid(task_tgid(current));
David S. Miller6e0895c2013-04-22 20:32:51 -04001544 current_uid_gid(&UNIXCB(skb).uid, &UNIXCB(skb).gid);
Eric Dumazet16e57262011-09-19 05:52:27 +00001545 }
1546}
1547
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001548static int maybe_init_creds(struct scm_cookie *scm,
1549 struct socket *socket,
1550 const struct sock *other)
1551{
1552 int err;
1553 struct msghdr msg = { .msg_controllen = 0 };
1554
1555 err = scm_send(socket, &msg, scm, false);
1556 if (err)
1557 return err;
1558
1559 if (unix_passcred_enabled(socket, other)) {
1560 scm->pid = get_pid(task_tgid(current));
1561 current_uid_gid(&scm->creds.uid, &scm->creds.gid);
1562 }
1563 return err;
1564}
1565
1566static bool unix_skb_scm_eq(struct sk_buff *skb,
1567 struct scm_cookie *scm)
1568{
1569 const struct unix_skb_parms *u = &UNIXCB(skb);
1570
1571 return u->pid == scm->pid &&
1572 uid_eq(u->uid, scm->creds.uid) &&
1573 gid_eq(u->gid, scm->creds.gid) &&
1574 unix_secdata_eq(scm, skb);
1575}
1576
Eric Dumazet16e57262011-09-19 05:52:27 +00001577/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578 * Send AF_UNIX data.
1579 */
1580
Ying Xue1b784142015-03-02 15:37:48 +08001581static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
1582 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001585 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586 struct unix_sock *u = unix_sk(sk);
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001587 DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588 struct sock *other = NULL;
1589 int namelen = 0; /* fake GCC */
1590 int err;
Eric Dumazet95c96172012-04-15 05:58:06 +00001591 unsigned int hash;
David S. Millerf78a5fd2011-09-16 19:34:00 -04001592 struct sk_buff *skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593 long timeo;
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001594 struct scm_cookie scm;
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001595 int data_len = 0;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001596 int sk_locked;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597
dann frazier5f23b732008-11-26 15:32:27 -08001598 wait_for_unix_gc();
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001599 err = scm_send(sock, msg, &scm, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600 if (err < 0)
1601 return err;
1602
1603 err = -EOPNOTSUPP;
1604 if (msg->msg_flags&MSG_OOB)
1605 goto out;
1606
1607 if (msg->msg_namelen) {
1608 err = unix_mkname(sunaddr, msg->msg_namelen, &hash);
1609 if (err < 0)
1610 goto out;
1611 namelen = err;
1612 } else {
1613 sunaddr = NULL;
1614 err = -ENOTCONN;
1615 other = unix_peer_get(sk);
1616 if (!other)
1617 goto out;
1618 }
1619
Joe Perchesf64f9e72009-11-29 16:55:45 -08001620 if (test_bit(SOCK_PASSCRED, &sock->flags) && !u->addr
1621 && (err = unix_autobind(sock)) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622 goto out;
1623
1624 err = -EMSGSIZE;
1625 if (len > sk->sk_sndbuf - 32)
1626 goto out;
1627
Kirill Tkhai31ff6aa2014-05-15 19:56:28 +04001628 if (len > SKB_MAX_ALLOC) {
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001629 data_len = min_t(size_t,
1630 len - SKB_MAX_ALLOC,
1631 MAX_SKB_FRAGS * PAGE_SIZE);
Kirill Tkhai31ff6aa2014-05-15 19:56:28 +04001632 data_len = PAGE_ALIGN(data_len);
1633
1634 BUILD_BUG_ON(SKB_MAX_ALLOC < PAGE_SIZE);
1635 }
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001636
1637 skb = sock_alloc_send_pskb(sk, len - data_len, data_len,
Eric Dumazet28d64272013-08-08 14:38:47 -07001638 msg->msg_flags & MSG_DONTWAIT, &err,
1639 PAGE_ALLOC_COSTLY_ORDER);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001640 if (skb == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641 goto out;
1642
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001643 err = unix_scm_to_skb(&scm, skb, true);
Eric Dumazet25888e32010-11-25 04:11:39 +00001644 if (err < 0)
Eric W. Biederman7361c362010-06-13 03:34:33 +00001645 goto out_free;
Catherine Zhang877ce7c2006-06-29 12:27:47 -07001646
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001647 skb_put(skb, len - data_len);
1648 skb->data_len = data_len;
1649 skb->len = len;
Al Viroc0371da2014-11-24 10:42:55 -05001650 err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001651 if (err)
1652 goto out_free;
1653
1654 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1655
1656restart:
1657 if (!other) {
1658 err = -ECONNRESET;
1659 if (sunaddr == NULL)
1660 goto out_free;
1661
Denis V. Lunev097e66c2007-11-19 22:29:30 -08001662 other = unix_find_other(net, sunaddr, namelen, sk->sk_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663 hash, &err);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001664 if (other == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001665 goto out_free;
1666 }
1667
Alban Crequyd6ae3ba2011-01-18 06:39:15 +00001668 if (sk_filter(other, skb) < 0) {
1669 /* Toss the packet but do not return any error to the sender */
1670 err = len;
1671 goto out_free;
1672 }
1673
Rainer Weikusat7d267272015-11-20 22:07:23 +00001674 sk_locked = 0;
David S. Miller1c92b4e2007-05-31 13:24:26 -07001675 unix_state_lock(other);
Rainer Weikusat7d267272015-11-20 22:07:23 +00001676restart_locked:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001677 err = -EPERM;
1678 if (!unix_may_send(sk, other))
1679 goto out_unlock;
1680
Rainer Weikusat7d267272015-11-20 22:07:23 +00001681 if (unlikely(sock_flag(other, SOCK_DEAD))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001682 /*
1683 * Check with 1003.1g - what should
1684 * datagram error
1685 */
David S. Miller1c92b4e2007-05-31 13:24:26 -07001686 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001687 sock_put(other);
1688
Rainer Weikusat7d267272015-11-20 22:07:23 +00001689 if (!sk_locked)
1690 unix_state_lock(sk);
1691
Linus Torvalds1da177e2005-04-16 15:20:36 -07001692 err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001693 if (unix_peer(sk) == other) {
Jianjun Konge27dfce2008-11-01 21:38:31 -07001694 unix_peer(sk) = NULL;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001695 unix_dgram_peer_wake_disconnect_wakeup(sk, other);
1696
David S. Miller1c92b4e2007-05-31 13:24:26 -07001697 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001698
1699 unix_dgram_disconnected(sk, other);
1700 sock_put(other);
1701 err = -ECONNREFUSED;
1702 } else {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001703 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001704 }
1705
1706 other = NULL;
1707 if (err)
1708 goto out_free;
1709 goto restart;
1710 }
1711
1712 err = -EPIPE;
1713 if (other->sk_shutdown & RCV_SHUTDOWN)
1714 goto out_unlock;
1715
1716 if (sk->sk_type != SOCK_SEQPACKET) {
1717 err = security_unix_may_send(sk->sk_socket, other->sk_socket);
1718 if (err)
1719 goto out_unlock;
1720 }
1721
Rainer Weikusata5527dd2016-02-11 19:37:27 +00001722 /* other == sk && unix_peer(other) != sk if
1723 * - unix_peer(sk) == NULL, destination address bound to sk
1724 * - unix_peer(sk) == sk by time of get but disconnected before lock
1725 */
1726 if (other != sk &&
1727 unlikely(unix_peer(other) != sk && unix_recvq_full(other))) {
Rainer Weikusat7d267272015-11-20 22:07:23 +00001728 if (timeo) {
1729 timeo = unix_wait_for_peer(other, timeo);
1730
1731 err = sock_intr_errno(timeo);
1732 if (signal_pending(current))
1733 goto out_free;
1734
1735 goto restart;
1736 }
1737
1738 if (!sk_locked) {
1739 unix_state_unlock(other);
1740 unix_state_double_lock(sk, other);
1741 }
1742
1743 if (unix_peer(sk) != other ||
1744 unix_dgram_peer_wake_me(sk, other)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 err = -EAGAIN;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001746 sk_locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001747 goto out_unlock;
1748 }
1749
Rainer Weikusat7d267272015-11-20 22:07:23 +00001750 if (!sk_locked) {
1751 sk_locked = 1;
1752 goto restart_locked;
1753 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001754 }
1755
Rainer Weikusat7d267272015-11-20 22:07:23 +00001756 if (unlikely(sk_locked))
1757 unix_state_unlock(sk);
1758
Alban Crequy3f661162010-10-04 08:48:28 +00001759 if (sock_flag(other, SOCK_RCVTSTAMP))
1760 __net_timestamp(skb);
Eric Dumazet16e57262011-09-19 05:52:27 +00001761 maybe_add_creds(skb, sock, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001762 skb_queue_tail(&other->sk_receive_queue, skb);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001763 unix_state_unlock(other);
David S. Miller676d2362014-04-11 16:15:36 -04001764 other->sk_data_ready(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765 sock_put(other);
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001766 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767 return len;
1768
1769out_unlock:
Rainer Weikusat7d267272015-11-20 22:07:23 +00001770 if (sk_locked)
1771 unix_state_unlock(sk);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001772 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773out_free:
1774 kfree_skb(skb);
1775out:
1776 if (other)
1777 sock_put(other);
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001778 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779 return err;
1780}
1781
Eric Dumazete370a722013-08-08 14:37:32 -07001782/* We use paged skbs for stream sockets, and limit occupancy to 32768
Tobias Klauserd4e9a402018-02-13 11:11:30 +01001783 * bytes, and a minimum of a full page.
Eric Dumazete370a722013-08-08 14:37:32 -07001784 */
1785#define UNIX_SKB_FRAGS_SZ (PAGE_SIZE << get_order(32768))
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001786
Ying Xue1b784142015-03-02 15:37:48 +08001787static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
1788 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001790 struct sock *sk = sock->sk;
1791 struct sock *other = NULL;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001792 int err, size;
David S. Millerf78a5fd2011-09-16 19:34:00 -04001793 struct sk_buff *skb;
Jianjun Konge27dfce2008-11-01 21:38:31 -07001794 int sent = 0;
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001795 struct scm_cookie scm;
Miklos Szeredi8ba69ba2009-09-11 11:31:45 -07001796 bool fds_sent = false;
Eric Dumazete370a722013-08-08 14:37:32 -07001797 int data_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001798
dann frazier5f23b732008-11-26 15:32:27 -08001799 wait_for_unix_gc();
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001800 err = scm_send(sock, msg, &scm, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001801 if (err < 0)
1802 return err;
1803
1804 err = -EOPNOTSUPP;
1805 if (msg->msg_flags&MSG_OOB)
1806 goto out_err;
1807
1808 if (msg->msg_namelen) {
1809 err = sk->sk_state == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP;
1810 goto out_err;
1811 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812 err = -ENOTCONN;
Benjamin LaHaise830a1e52005-12-13 23:22:32 -08001813 other = unix_peer(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814 if (!other)
1815 goto out_err;
1816 }
1817
1818 if (sk->sk_shutdown & SEND_SHUTDOWN)
1819 goto pipe_err;
1820
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001821 while (sent < len) {
Eric Dumazete370a722013-08-08 14:37:32 -07001822 size = len - sent;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001823
1824 /* Keep two messages in the pipe so it schedules better */
Eric Dumazete370a722013-08-08 14:37:32 -07001825 size = min_t(int, size, (sk->sk_sndbuf >> 1) - 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001826
Eric Dumazete370a722013-08-08 14:37:32 -07001827 /* allow fallback to order-0 allocations */
1828 size = min_t(int, size, SKB_MAX_HEAD(0) + UNIX_SKB_FRAGS_SZ);
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001829
Eric Dumazete370a722013-08-08 14:37:32 -07001830 data_len = max_t(int, 0, size - SKB_MAX_HEAD(0));
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001831
Kirill Tkhai31ff6aa2014-05-15 19:56:28 +04001832 data_len = min_t(size_t, size, PAGE_ALIGN(data_len));
1833
Eric Dumazete370a722013-08-08 14:37:32 -07001834 skb = sock_alloc_send_pskb(sk, size - data_len, data_len,
Eric Dumazet28d64272013-08-08 14:38:47 -07001835 msg->msg_flags & MSG_DONTWAIT, &err,
1836 get_order(UNIX_SKB_FRAGS_SZ));
Eric Dumazete370a722013-08-08 14:37:32 -07001837 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001838 goto out_err;
1839
David S. Millerf78a5fd2011-09-16 19:34:00 -04001840 /* Only send the fds in the first buffer */
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001841 err = unix_scm_to_skb(&scm, skb, !fds_sent);
Eric Dumazet25888e32010-11-25 04:11:39 +00001842 if (err < 0) {
Eric W. Biederman7361c362010-06-13 03:34:33 +00001843 kfree_skb(skb);
David S. Millerf78a5fd2011-09-16 19:34:00 -04001844 goto out_err;
Miklos Szeredi62093442008-11-09 15:23:57 +01001845 }
Eric W. Biederman7361c362010-06-13 03:34:33 +00001846 fds_sent = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001847
Eric Dumazete370a722013-08-08 14:37:32 -07001848 skb_put(skb, size - data_len);
1849 skb->data_len = data_len;
1850 skb->len = size;
Al Viroc0371da2014-11-24 10:42:55 -05001851 err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, size);
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001852 if (err) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001853 kfree_skb(skb);
David S. Millerf78a5fd2011-09-16 19:34:00 -04001854 goto out_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001855 }
1856
David S. Miller1c92b4e2007-05-31 13:24:26 -07001857 unix_state_lock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001858
1859 if (sock_flag(other, SOCK_DEAD) ||
1860 (other->sk_shutdown & RCV_SHUTDOWN))
1861 goto pipe_err_free;
1862
Eric Dumazet16e57262011-09-19 05:52:27 +00001863 maybe_add_creds(skb, sock, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001864 skb_queue_tail(&other->sk_receive_queue, skb);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001865 unix_state_unlock(other);
David S. Miller676d2362014-04-11 16:15:36 -04001866 other->sk_data_ready(other);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001867 sent += size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001868 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001869
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001870 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001871
1872 return sent;
1873
1874pipe_err_free:
David S. Miller1c92b4e2007-05-31 13:24:26 -07001875 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001876 kfree_skb(skb);
1877pipe_err:
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001878 if (sent == 0 && !(msg->msg_flags&MSG_NOSIGNAL))
1879 send_sig(SIGPIPE, current, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001880 err = -EPIPE;
1881out_err:
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001882 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001883 return sent ? : err;
1884}
1885
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001886static ssize_t unix_stream_sendpage(struct socket *socket, struct page *page,
1887 int offset, size_t size, int flags)
1888{
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001889 int err;
1890 bool send_sigpipe = false;
1891 bool init_scm = true;
1892 struct scm_cookie scm;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001893 struct sock *other, *sk = socket->sk;
1894 struct sk_buff *skb, *newskb = NULL, *tail = NULL;
1895
1896 if (flags & MSG_OOB)
1897 return -EOPNOTSUPP;
1898
1899 other = unix_peer(sk);
1900 if (!other || sk->sk_state != TCP_ESTABLISHED)
1901 return -ENOTCONN;
1902
1903 if (false) {
1904alloc_skb:
1905 unix_state_unlock(other);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001906 mutex_unlock(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001907 newskb = sock_alloc_send_pskb(sk, 0, 0, flags & MSG_DONTWAIT,
1908 &err, 0);
1909 if (!newskb)
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001910 goto err;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001911 }
1912
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001913 /* we must acquire iolock as we modify already present
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001914 * skbs in the sk_receive_queue and mess with skb->len
1915 */
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001916 err = mutex_lock_interruptible(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001917 if (err) {
1918 err = flags & MSG_DONTWAIT ? -EAGAIN : -ERESTARTSYS;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001919 goto err;
1920 }
1921
1922 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1923 err = -EPIPE;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001924 send_sigpipe = true;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001925 goto err_unlock;
1926 }
1927
1928 unix_state_lock(other);
1929
1930 if (sock_flag(other, SOCK_DEAD) ||
1931 other->sk_shutdown & RCV_SHUTDOWN) {
1932 err = -EPIPE;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001933 send_sigpipe = true;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001934 goto err_state_unlock;
1935 }
1936
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001937 if (init_scm) {
1938 err = maybe_init_creds(&scm, socket, other);
1939 if (err)
1940 goto err_state_unlock;
1941 init_scm = false;
1942 }
1943
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001944 skb = skb_peek_tail(&other->sk_receive_queue);
1945 if (tail && tail == skb) {
1946 skb = newskb;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001947 } else if (!skb || !unix_skb_scm_eq(skb, &scm)) {
1948 if (newskb) {
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001949 skb = newskb;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001950 } else {
1951 tail = skb;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001952 goto alloc_skb;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001953 }
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001954 } else if (newskb) {
1955 /* this is fast path, we don't necessarily need to
1956 * call to kfree_skb even though with newskb == NULL
1957 * this - does no harm
1958 */
1959 consume_skb(newskb);
Hannes Frederic Sowa8844f972015-11-16 16:25:56 +01001960 newskb = NULL;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001961 }
1962
1963 if (skb_append_pagefrags(skb, page, offset, size)) {
1964 tail = skb;
1965 goto alloc_skb;
1966 }
1967
1968 skb->len += size;
1969 skb->data_len += size;
1970 skb->truesize += size;
Reshetova, Elena14afee42017-06-30 13:08:00 +03001971 refcount_add(size, &sk->sk_wmem_alloc);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001972
Hannes Frederic Sowaa3a116e2015-11-17 15:10:59 +01001973 if (newskb) {
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001974 err = unix_scm_to_skb(&scm, skb, false);
1975 if (err)
1976 goto err_state_unlock;
Hannes Frederic Sowaa3a116e2015-11-17 15:10:59 +01001977 spin_lock(&other->sk_receive_queue.lock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001978 __skb_queue_tail(&other->sk_receive_queue, newskb);
Hannes Frederic Sowaa3a116e2015-11-17 15:10:59 +01001979 spin_unlock(&other->sk_receive_queue.lock);
1980 }
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001981
1982 unix_state_unlock(other);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001983 mutex_unlock(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001984
1985 other->sk_data_ready(other);
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001986 scm_destroy(&scm);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001987 return size;
1988
1989err_state_unlock:
1990 unix_state_unlock(other);
1991err_unlock:
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001992 mutex_unlock(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001993err:
1994 kfree_skb(newskb);
1995 if (send_sigpipe && !(flags & MSG_NOSIGNAL))
1996 send_sig(SIGPIPE, current, 0);
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001997 if (!init_scm)
1998 scm_destroy(&scm);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001999 return err;
2000}
2001
Ying Xue1b784142015-03-02 15:37:48 +08002002static int unix_seqpacket_sendmsg(struct socket *sock, struct msghdr *msg,
2003 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002004{
2005 int err;
2006 struct sock *sk = sock->sk;
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002007
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008 err = sock_error(sk);
2009 if (err)
2010 return err;
2011
2012 if (sk->sk_state != TCP_ESTABLISHED)
2013 return -ENOTCONN;
2014
2015 if (msg->msg_namelen)
2016 msg->msg_namelen = 0;
2017
Ying Xue1b784142015-03-02 15:37:48 +08002018 return unix_dgram_sendmsg(sock, msg, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002019}
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002020
Ying Xue1b784142015-03-02 15:37:48 +08002021static int unix_seqpacket_recvmsg(struct socket *sock, struct msghdr *msg,
2022 size_t size, int flags)
Eric W. Biedermana05d2ad2011-04-24 01:54:57 +00002023{
2024 struct sock *sk = sock->sk;
2025
2026 if (sk->sk_state != TCP_ESTABLISHED)
2027 return -ENOTCONN;
2028
Ying Xue1b784142015-03-02 15:37:48 +08002029 return unix_dgram_recvmsg(sock, msg, size, flags);
Eric W. Biedermana05d2ad2011-04-24 01:54:57 +00002030}
2031
Linus Torvalds1da177e2005-04-16 15:20:36 -07002032static void unix_copy_addr(struct msghdr *msg, struct sock *sk)
2033{
Al Viroae3b5642019-02-15 20:09:35 +00002034 struct unix_address *addr = smp_load_acquire(&unix_sk(sk)->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002035
Al Viroae3b5642019-02-15 20:09:35 +00002036 if (addr) {
2037 msg->msg_namelen = addr->len;
2038 memcpy(msg->msg_name, addr->name, addr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002039 }
2040}
2041
Ying Xue1b784142015-03-02 15:37:48 +08002042static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
2043 size_t size, int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002044{
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002045 struct scm_cookie scm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046 struct sock *sk = sock->sk;
2047 struct unix_sock *u = unix_sk(sk);
Rainer Weikusat64874282015-12-06 21:11:38 +00002048 struct sk_buff *skb, *last;
2049 long timeo;
Paolo Abenifd69c392019-04-08 10:15:59 +02002050 int skip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002051 int err;
2052
2053 err = -EOPNOTSUPP;
2054 if (flags&MSG_OOB)
2055 goto out;
2056
Rainer Weikusat64874282015-12-06 21:11:38 +00002057 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002058
Rainer Weikusat64874282015-12-06 21:11:38 +00002059 do {
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002060 mutex_lock(&u->iolock);
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002061
Rainer Weikusat64874282015-12-06 21:11:38 +00002062 skip = sk_peek_offset(sk, flags);
Paolo Abenifd69c392019-04-08 10:15:59 +02002063 skb = __skb_try_recv_datagram(sk, flags, NULL, &skip, &err,
2064 &last);
Rainer Weikusat64874282015-12-06 21:11:38 +00002065 if (skb)
2066 break;
2067
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002068 mutex_unlock(&u->iolock);
Rainer Weikusat64874282015-12-06 21:11:38 +00002069
2070 if (err != -EAGAIN)
2071 break;
2072 } while (timeo &&
2073 !__skb_wait_for_more_packets(sk, &err, &timeo, last));
2074
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002075 if (!skb) { /* implies iolock unlocked */
Florian Zumbiehl0a112252007-11-29 23:19:23 +11002076 unix_state_lock(sk);
2077 /* Signal EOF on disconnected non-blocking SEQPACKET socket. */
2078 if (sk->sk_type == SOCK_SEQPACKET && err == -EAGAIN &&
2079 (sk->sk_shutdown & RCV_SHUTDOWN))
2080 err = 0;
2081 unix_state_unlock(sk);
Rainer Weikusat64874282015-12-06 21:11:38 +00002082 goto out;
Florian Zumbiehl0a112252007-11-29 23:19:23 +11002083 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084
Rainer Weikusat77b75f42015-11-26 19:23:15 +00002085 if (wq_has_sleeper(&u->peer_wait))
2086 wake_up_interruptible_sync_poll(&u->peer_wait,
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002087 EPOLLOUT | EPOLLWRNORM |
2088 EPOLLWRBAND);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089
2090 if (msg->msg_name)
2091 unix_copy_addr(msg, skb->sk);
2092
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002093 if (size > skb->len - skip)
2094 size = skb->len - skip;
2095 else if (size < skb->len - skip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002096 msg->msg_flags |= MSG_TRUNC;
2097
David S. Miller51f3d022014-11-05 16:46:40 -05002098 err = skb_copy_datagram_msg(skb, skip, msg, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002099 if (err)
2100 goto out_free;
2101
Alban Crequy3f661162010-10-04 08:48:28 +00002102 if (sock_flag(sk, SOCK_RCVTSTAMP))
2103 __sock_recv_timestamp(msg, sk, skb);
2104
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002105 memset(&scm, 0, sizeof(scm));
2106
2107 scm_set_cred(&scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid);
2108 unix_set_secdata(&scm, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002110 if (!(flags & MSG_PEEK)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002112 unix_detach_fds(&scm, skb);
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002113
2114 sk_peek_offset_bwd(sk, skb->len);
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002115 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002116 /* It is questionable: on PEEK we could:
2117 - do not return fds - good, but too simple 8)
2118 - return fds, and do not return them on read (old strategy,
2119 apparently wrong)
2120 - clone fds (I chose it for now, it is the most universal
2121 solution)
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002122
2123 POSIX 1003.1g does not actually define this clearly
2124 at all. POSIX 1003.1g doesn't define a lot of things
2125 clearly however!
2126
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127 */
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002128
2129 sk_peek_offset_fwd(sk, size);
2130
Linus Torvalds1da177e2005-04-16 15:20:36 -07002131 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002132 scm.fp = scm_fp_dup(UNIXCB(skb).fp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133 }
Eric Dumazet9f6f9af2012-02-21 23:24:55 +00002134 err = (flags & MSG_TRUNC) ? skb->len - skip : size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002135
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002136 scm_recv(sock, msg, &scm, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002137
2138out_free:
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002139 skb_free_datagram(sk, skb);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002140 mutex_unlock(&u->iolock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141out:
2142 return err;
2143}
2144
2145/*
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002146 * Sleep until more data has arrived. But check for races..
Linus Torvalds1da177e2005-04-16 15:20:36 -07002147 */
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002148static long unix_stream_data_wait(struct sock *sk, long timeo,
WANG Cong06a77b02016-11-17 15:55:26 -08002149 struct sk_buff *last, unsigned int last_len,
2150 bool freezable)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151{
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002152 struct sk_buff *tail;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002153 DEFINE_WAIT(wait);
2154
David S. Miller1c92b4e2007-05-31 13:24:26 -07002155 unix_state_lock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156
2157 for (;;) {
Eric Dumazetaa395142010-04-20 13:03:51 +00002158 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002159
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002160 tail = skb_peek_tail(&sk->sk_receive_queue);
2161 if (tail != last ||
2162 (tail && tail->len != last_len) ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002163 sk->sk_err ||
2164 (sk->sk_shutdown & RCV_SHUTDOWN) ||
2165 signal_pending(current) ||
2166 !timeo)
2167 break;
2168
Eric Dumazet9cd3e072015-11-29 20:03:10 -08002169 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002170 unix_state_unlock(sk);
WANG Cong06a77b02016-11-17 15:55:26 -08002171 if (freezable)
2172 timeo = freezable_schedule_timeout(timeo);
2173 else
2174 timeo = schedule_timeout(timeo);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002175 unix_state_lock(sk);
Mark Salyzynb48732e2015-05-26 08:22:19 -07002176
2177 if (sock_flag(sk, SOCK_DEAD))
2178 break;
2179
Eric Dumazet9cd3e072015-11-29 20:03:10 -08002180 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002181 }
2182
Eric Dumazetaa395142010-04-20 13:03:51 +00002183 finish_wait(sk_sleep(sk), &wait);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002184 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185 return timeo;
2186}
2187
Eric Dumazete370a722013-08-08 14:37:32 -07002188static unsigned int unix_skb_len(const struct sk_buff *skb)
2189{
2190 return skb->len - UNIXCB(skb).consumed;
2191}
2192
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002193struct unix_stream_read_state {
2194 int (*recv_actor)(struct sk_buff *, int, int,
2195 struct unix_stream_read_state *);
2196 struct socket *socket;
2197 struct msghdr *msg;
2198 struct pipe_inode_info *pipe;
2199 size_t size;
2200 int flags;
2201 unsigned int splice_flags;
2202};
2203
WANG Cong06a77b02016-11-17 15:55:26 -08002204static int unix_stream_read_generic(struct unix_stream_read_state *state,
2205 bool freezable)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206{
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002207 struct scm_cookie scm;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002208 struct socket *sock = state->socket;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209 struct sock *sk = sock->sk;
2210 struct unix_sock *u = unix_sk(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002211 int copied = 0;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002212 int flags = state->flags;
Eric Dumazetde144392014-03-25 18:42:27 -07002213 int noblock = flags & MSG_DONTWAIT;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002214 bool check_creds = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215 int target;
2216 int err = 0;
2217 long timeo;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002218 int skip;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002219 size_t size = state->size;
2220 unsigned int last_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002221
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002222 if (unlikely(sk->sk_state != TCP_ESTABLISHED)) {
2223 err = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002224 goto out;
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002225 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002226
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002227 if (unlikely(flags & MSG_OOB)) {
2228 err = -EOPNOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002229 goto out;
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002230 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002231
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002232 target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
Eric Dumazetde144392014-03-25 18:42:27 -07002233 timeo = sock_rcvtimeo(sk, noblock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002235 memset(&scm, 0, sizeof(scm));
2236
Linus Torvalds1da177e2005-04-16 15:20:36 -07002237 /* Lock the socket to prevent queue disordering
2238 * while sleeps in memcpy_tomsg
2239 */
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002240 mutex_lock(&u->iolock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002241
Matthew Dawsona0917e02017-08-18 15:04:54 -04002242 skip = max(sk_peek_offset(sk, flags), 0);
Andrey Vagine9193d62015-10-02 00:05:36 +03002243
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002244 do {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 int chunk;
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002246 bool drop_skb;
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002247 struct sk_buff *skb, *last;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248
Rainer Weikusat18eceb82016-02-18 12:39:46 +00002249redo:
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002250 unix_state_lock(sk);
Mark Salyzynb48732e2015-05-26 08:22:19 -07002251 if (sock_flag(sk, SOCK_DEAD)) {
2252 err = -ECONNRESET;
2253 goto unlock;
2254 }
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002255 last = skb = skb_peek(&sk->sk_receive_queue);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002256 last_len = last ? last->len : 0;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002257again:
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002258 if (skb == NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259 if (copied >= target)
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002260 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002261
2262 /*
2263 * POSIX 1003.1g mandates this order.
2264 */
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002265
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002266 err = sock_error(sk);
2267 if (err)
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002268 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002269 if (sk->sk_shutdown & RCV_SHUTDOWN)
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002270 goto unlock;
2271
2272 unix_state_unlock(sk);
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002273 if (!timeo) {
2274 err = -EAGAIN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002275 break;
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002276 }
2277
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002278 mutex_unlock(&u->iolock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002279
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002280 timeo = unix_stream_data_wait(sk, timeo, last,
WANG Cong06a77b02016-11-17 15:55:26 -08002281 last_len, freezable);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002282
Rainer Weikusat3822b5c2015-12-16 20:09:25 +00002283 if (signal_pending(current)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002284 err = sock_intr_errno(timeo);
Eric Dumazetfa0dc042016-01-24 13:53:50 -08002285 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286 goto out;
2287 }
Rainer Weikusatb3ca9b02011-02-28 04:50:55 +00002288
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002289 mutex_lock(&u->iolock);
Rainer Weikusat18eceb82016-02-18 12:39:46 +00002290 goto redo;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002291unlock:
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002292 unix_state_unlock(sk);
2293 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294 }
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002295
Eric Dumazete370a722013-08-08 14:37:32 -07002296 while (skip >= unix_skb_len(skb)) {
2297 skip -= unix_skb_len(skb);
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002298 last = skb;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002299 last_len = skb->len;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002300 skb = skb_peek_next(skb, &sk->sk_receive_queue);
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002301 if (!skb)
2302 goto again;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002303 }
2304
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002305 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306
2307 if (check_creds) {
2308 /* Never glue messages from different writers */
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002309 if (!unix_skb_scm_eq(skb, &scm))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310 break;
Eric W. Biederman0e82e7f6d2013-04-03 16:14:47 +00002311 } else if (test_bit(SOCK_PASSCRED, &sock->flags)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002312 /* Copy credentials */
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002313 scm_set_cred(&scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid);
Stephen Smalley37a9a8d2015-06-10 08:44:59 -04002314 unix_set_secdata(&scm, skb);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002315 check_creds = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002316 }
2317
2318 /* Copy address just once */
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002319 if (state->msg && state->msg->msg_name) {
2320 DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr,
2321 state->msg->msg_name);
2322 unix_copy_addr(state->msg, skb->sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002323 sunaddr = NULL;
2324 }
2325
Eric Dumazete370a722013-08-08 14:37:32 -07002326 chunk = min_t(unsigned int, unix_skb_len(skb) - skip, size);
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002327 skb_get(skb);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002328 chunk = state->recv_actor(skb, skip, chunk, state);
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002329 drop_skb = !unix_skb_len(skb);
2330 /* skb is only safe to use if !drop_skb */
2331 consume_skb(skb);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002332 if (chunk < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002333 if (copied == 0)
2334 copied = -EFAULT;
2335 break;
2336 }
2337 copied += chunk;
2338 size -= chunk;
2339
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002340 if (drop_skb) {
2341 /* the skb was touched by a concurrent reader;
2342 * we should not expect anything from this skb
2343 * anymore and assume it invalid - we can be
2344 * sure it was dropped from the socket queue
2345 *
2346 * let's report a short read
2347 */
2348 err = 0;
2349 break;
2350 }
2351
Linus Torvalds1da177e2005-04-16 15:20:36 -07002352 /* Mark read part of skb as used */
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002353 if (!(flags & MSG_PEEK)) {
Eric Dumazete370a722013-08-08 14:37:32 -07002354 UNIXCB(skb).consumed += chunk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002355
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002356 sk_peek_offset_bwd(sk, chunk);
2357
Linus Torvalds1da177e2005-04-16 15:20:36 -07002358 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002359 unix_detach_fds(&scm, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002360
Eric Dumazete370a722013-08-08 14:37:32 -07002361 if (unix_skb_len(skb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002362 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002363
Eric Dumazet6f01fd62012-01-28 16:11:03 +00002364 skb_unlink(skb, &sk->sk_receive_queue);
Neil Horman70d4bf62010-07-20 06:45:56 +00002365 consume_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002367 if (scm.fp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002368 break;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002369 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002370 /* It is questionable, see note in unix_dgram_recvmsg.
2371 */
2372 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002373 scm.fp = scm_fp_dup(UNIXCB(skb).fp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002374
Andrey Vagine9193d62015-10-02 00:05:36 +03002375 sk_peek_offset_fwd(sk, chunk);
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002376
Aaron Conole9f389e32015-09-26 18:50:43 -04002377 if (UNIXCB(skb).fp)
2378 break;
2379
Andrey Vagine9193d62015-10-02 00:05:36 +03002380 skip = 0;
Aaron Conole9f389e32015-09-26 18:50:43 -04002381 last = skb;
2382 last_len = skb->len;
2383 unix_state_lock(sk);
2384 skb = skb_peek_next(skb, &sk->sk_receive_queue);
2385 if (skb)
2386 goto again;
2387 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002388 break;
2389 }
2390 } while (size);
2391
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002392 mutex_unlock(&u->iolock);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002393 if (state->msg)
2394 scm_recv(sock, state->msg, &scm, flags);
2395 else
2396 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002397out:
2398 return copied ? : err;
2399}
2400
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002401static int unix_stream_read_actor(struct sk_buff *skb,
2402 int skip, int chunk,
2403 struct unix_stream_read_state *state)
2404{
2405 int ret;
2406
2407 ret = skb_copy_datagram_msg(skb, UNIXCB(skb).consumed + skip,
2408 state->msg, chunk);
2409 return ret ?: chunk;
2410}
2411
2412static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg,
2413 size_t size, int flags)
2414{
2415 struct unix_stream_read_state state = {
2416 .recv_actor = unix_stream_read_actor,
2417 .socket = sock,
2418 .msg = msg,
2419 .size = size,
2420 .flags = flags
2421 };
2422
WANG Cong06a77b02016-11-17 15:55:26 -08002423 return unix_stream_read_generic(&state, true);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002424}
2425
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002426static int unix_stream_splice_actor(struct sk_buff *skb,
2427 int skip, int chunk,
2428 struct unix_stream_read_state *state)
2429{
2430 return skb_splice_bits(skb, state->socket->sk,
2431 UNIXCB(skb).consumed + skip,
Al Viro25869262016-09-17 21:02:10 -04002432 state->pipe, chunk, state->splice_flags);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002433}
2434
2435static ssize_t unix_stream_splice_read(struct socket *sock, loff_t *ppos,
2436 struct pipe_inode_info *pipe,
2437 size_t size, unsigned int flags)
2438{
2439 struct unix_stream_read_state state = {
2440 .recv_actor = unix_stream_splice_actor,
2441 .socket = sock,
2442 .pipe = pipe,
2443 .size = size,
2444 .splice_flags = flags,
2445 };
2446
2447 if (unlikely(*ppos))
2448 return -ESPIPE;
2449
2450 if (sock->file->f_flags & O_NONBLOCK ||
2451 flags & SPLICE_F_NONBLOCK)
2452 state.flags = MSG_DONTWAIT;
2453
WANG Cong06a77b02016-11-17 15:55:26 -08002454 return unix_stream_read_generic(&state, false);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002455}
2456
Linus Torvalds1da177e2005-04-16 15:20:36 -07002457static int unix_shutdown(struct socket *sock, int mode)
2458{
2459 struct sock *sk = sock->sk;
2460 struct sock *other;
2461
Xi Wangfc61b922012-08-26 16:47:13 +00002462 if (mode < SHUT_RD || mode > SHUT_RDWR)
2463 return -EINVAL;
2464 /* This maps:
2465 * SHUT_RD (0) -> RCV_SHUTDOWN (1)
2466 * SHUT_WR (1) -> SEND_SHUTDOWN (2)
2467 * SHUT_RDWR (2) -> SHUTDOWN_MASK (3)
2468 */
2469 ++mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002470
Alban Crequy7180a032011-01-19 04:56:36 +00002471 unix_state_lock(sk);
2472 sk->sk_shutdown |= mode;
2473 other = unix_peer(sk);
2474 if (other)
2475 sock_hold(other);
2476 unix_state_unlock(sk);
2477 sk->sk_state_change(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002478
Alban Crequy7180a032011-01-19 04:56:36 +00002479 if (other &&
2480 (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002481
Alban Crequy7180a032011-01-19 04:56:36 +00002482 int peer_mode = 0;
2483
2484 if (mode&RCV_SHUTDOWN)
2485 peer_mode |= SEND_SHUTDOWN;
2486 if (mode&SEND_SHUTDOWN)
2487 peer_mode |= RCV_SHUTDOWN;
2488 unix_state_lock(other);
2489 other->sk_shutdown |= peer_mode;
2490 unix_state_unlock(other);
2491 other->sk_state_change(other);
2492 if (peer_mode == SHUTDOWN_MASK)
2493 sk_wake_async(other, SOCK_WAKE_WAITD, POLL_HUP);
2494 else if (peer_mode & RCV_SHUTDOWN)
2495 sk_wake_async(other, SOCK_WAKE_WAITD, POLL_IN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002496 }
Alban Crequy7180a032011-01-19 04:56:36 +00002497 if (other)
2498 sock_put(other);
2499
Linus Torvalds1da177e2005-04-16 15:20:36 -07002500 return 0;
2501}
2502
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002503long unix_inq_len(struct sock *sk)
2504{
2505 struct sk_buff *skb;
2506 long amount = 0;
2507
2508 if (sk->sk_state == TCP_LISTEN)
2509 return -EINVAL;
2510
2511 spin_lock(&sk->sk_receive_queue.lock);
2512 if (sk->sk_type == SOCK_STREAM ||
2513 sk->sk_type == SOCK_SEQPACKET) {
2514 skb_queue_walk(&sk->sk_receive_queue, skb)
Eric Dumazete370a722013-08-08 14:37:32 -07002515 amount += unix_skb_len(skb);
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002516 } else {
2517 skb = skb_peek(&sk->sk_receive_queue);
2518 if (skb)
2519 amount = skb->len;
2520 }
2521 spin_unlock(&sk->sk_receive_queue.lock);
2522
2523 return amount;
2524}
2525EXPORT_SYMBOL_GPL(unix_inq_len);
2526
2527long unix_outq_len(struct sock *sk)
2528{
2529 return sk_wmem_alloc_get(sk);
2530}
2531EXPORT_SYMBOL_GPL(unix_outq_len);
2532
Andrey Vaginba94f302017-02-01 11:00:45 -08002533static int unix_open_file(struct sock *sk)
2534{
2535 struct path path;
2536 struct file *f;
2537 int fd;
2538
2539 if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))
2540 return -EPERM;
2541
Al Viroae3b5642019-02-15 20:09:35 +00002542 if (!smp_load_acquire(&unix_sk(sk)->addr))
Andrey Vaginba94f302017-02-01 11:00:45 -08002543 return -ENOENT;
Al Viroae3b5642019-02-15 20:09:35 +00002544
2545 path = unix_sk(sk)->path;
2546 if (!path.dentry)
2547 return -ENOENT;
Andrey Vaginba94f302017-02-01 11:00:45 -08002548
2549 path_get(&path);
Andrey Vaginba94f302017-02-01 11:00:45 -08002550
2551 fd = get_unused_fd_flags(O_CLOEXEC);
2552 if (fd < 0)
2553 goto out;
2554
2555 f = dentry_open(&path, O_PATH, current_cred());
2556 if (IS_ERR(f)) {
2557 put_unused_fd(fd);
2558 fd = PTR_ERR(f);
2559 goto out;
2560 }
2561
2562 fd_install(fd, f);
2563out:
2564 path_put(&path);
2565
2566 return fd;
2567}
2568
Linus Torvalds1da177e2005-04-16 15:20:36 -07002569static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
2570{
2571 struct sock *sk = sock->sk;
Jianjun Konge27dfce2008-11-01 21:38:31 -07002572 long amount = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002573 int err;
2574
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002575 switch (cmd) {
2576 case SIOCOUTQ:
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002577 amount = unix_outq_len(sk);
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002578 err = put_user(amount, (int __user *)arg);
2579 break;
2580 case SIOCINQ:
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002581 amount = unix_inq_len(sk);
2582 if (amount < 0)
2583 err = amount;
2584 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002585 err = put_user(amount, (int __user *)arg);
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002586 break;
Andrey Vaginba94f302017-02-01 11:00:45 -08002587 case SIOCUNIXFILE:
2588 err = unix_open_file(sk);
2589 break;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002590 default:
2591 err = -ENOIOCTLCMD;
2592 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002593 }
2594 return err;
2595}
2596
Arnd Bergmann5f6beb92019-06-03 22:03:44 +02002597#ifdef CONFIG_COMPAT
2598static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
2599{
2600 return unix_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
2601}
2602#endif
2603
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002604static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002605{
2606 struct sock *sk = sock->sk;
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002607 __poll_t mask;
2608
Karsten Graul89ab0662018-10-23 13:40:39 +02002609 sock_poll_wait(file, sock, wait);
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002610 mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002611
2612 /* exceptional events? */
2613 if (sk->sk_err)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002614 mask |= EPOLLERR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002615 if (sk->sk_shutdown == SHUTDOWN_MASK)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002616 mask |= EPOLLHUP;
Davide Libenzif348d702006-03-25 03:07:39 -08002617 if (sk->sk_shutdown & RCV_SHUTDOWN)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002618 mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002619
2620 /* readable? */
Eric Dumazetdb409802010-09-06 11:13:50 +00002621 if (!skb_queue_empty(&sk->sk_receive_queue))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002622 mask |= EPOLLIN | EPOLLRDNORM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002623
2624 /* Connection-based need to check for termination and startup */
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002625 if ((sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) &&
2626 sk->sk_state == TCP_CLOSE)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002627 mask |= EPOLLHUP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002628
2629 /*
2630 * we set writable also when the other side has shut down the
2631 * connection. This prevents stuck sockets.
2632 */
2633 if (unix_writable(sk))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002634 mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002635
2636 return mask;
2637}
2638
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002639static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,
2640 poll_table *wait)
Rainer Weikusat3c734192008-06-17 22:28:05 -07002641{
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002642 struct sock *sk = sock->sk, *other;
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002643 unsigned int writable;
2644 __poll_t mask;
2645
Karsten Graul89ab0662018-10-23 13:40:39 +02002646 sock_poll_wait(file, sock, wait);
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002647 mask = 0;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002648
2649 /* exceptional events? */
2650 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002651 mask |= EPOLLERR |
2652 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0);
Keller, Jacob E7d4c04f2013-03-28 11:19:25 +00002653
Rainer Weikusat3c734192008-06-17 22:28:05 -07002654 if (sk->sk_shutdown & RCV_SHUTDOWN)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002655 mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002656 if (sk->sk_shutdown == SHUTDOWN_MASK)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002657 mask |= EPOLLHUP;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002658
2659 /* readable? */
Eric Dumazet5456f092010-10-31 05:36:23 +00002660 if (!skb_queue_empty(&sk->sk_receive_queue))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002661 mask |= EPOLLIN | EPOLLRDNORM;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002662
2663 /* Connection-based need to check for termination and startup */
2664 if (sk->sk_type == SOCK_SEQPACKET) {
2665 if (sk->sk_state == TCP_CLOSE)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002666 mask |= EPOLLHUP;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002667 /* connection hasn't started yet? */
2668 if (sk->sk_state == TCP_SYN_SENT)
2669 return mask;
2670 }
2671
Eric Dumazet973a34a2010-10-31 05:38:25 +00002672 /* No write status requested, avoid expensive OUT tests. */
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002673 if (!(poll_requested_events(wait) & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT)))
Eric Dumazet973a34a2010-10-31 05:38:25 +00002674 return mask;
2675
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002676 writable = unix_writable(sk);
Rainer Weikusat7d267272015-11-20 22:07:23 +00002677 if (writable) {
2678 unix_state_lock(sk);
2679
2680 other = unix_peer(sk);
2681 if (other && unix_peer(other) != sk &&
2682 unix_recvq_full(other) &&
2683 unix_dgram_peer_wake_me(sk, other))
2684 writable = 0;
2685
2686 unix_state_unlock(sk);
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002687 }
2688
2689 if (writable)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002690 mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002691 else
Eric Dumazet9cd3e072015-11-29 20:03:10 -08002692 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
Rainer Weikusat3c734192008-06-17 22:28:05 -07002693
Rainer Weikusat3c734192008-06-17 22:28:05 -07002694 return mask;
2695}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002696
2697#ifdef CONFIG_PROC_FS
Pavel Emelyanova53eb3f2007-11-23 20:30:01 +08002698
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002699#define BUCKET_SPACE (BITS_PER_LONG - (UNIX_HASH_BITS + 1) - 1)
2700
2701#define get_bucket(x) ((x) >> BUCKET_SPACE)
2702#define get_offset(x) ((x) & ((1L << BUCKET_SPACE) - 1))
2703#define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o))
Pavel Emelyanova53eb3f2007-11-23 20:30:01 +08002704
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002705static struct sock *unix_from_bucket(struct seq_file *seq, loff_t *pos)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002706{
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002707 unsigned long offset = get_offset(*pos);
2708 unsigned long bucket = get_bucket(*pos);
2709 struct sock *sk;
2710 unsigned long count = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002711
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002712 for (sk = sk_head(&unix_socket_table[bucket]); sk; sk = sk_next(sk)) {
2713 if (sock_net(sk) != seq_file_net(seq))
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002714 continue;
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002715 if (++count == offset)
2716 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002717 }
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002718
2719 return sk;
2720}
2721
2722static struct sock *unix_next_socket(struct seq_file *seq,
2723 struct sock *sk,
2724 loff_t *pos)
2725{
2726 unsigned long bucket;
2727
2728 while (sk > (struct sock *)SEQ_START_TOKEN) {
2729 sk = sk_next(sk);
2730 if (!sk)
2731 goto next_bucket;
2732 if (sock_net(sk) == seq_file_net(seq))
2733 return sk;
2734 }
2735
2736 do {
2737 sk = unix_from_bucket(seq, pos);
2738 if (sk)
2739 return sk;
2740
2741next_bucket:
2742 bucket = get_bucket(*pos) + 1;
2743 *pos = set_bucket_offset(bucket, 1);
2744 } while (bucket < ARRAY_SIZE(unix_socket_table));
2745
Linus Torvalds1da177e2005-04-16 15:20:36 -07002746 return NULL;
2747}
2748
Linus Torvalds1da177e2005-04-16 15:20:36 -07002749static void *unix_seq_start(struct seq_file *seq, loff_t *pos)
Eric Dumazet9a429c42008-01-01 21:58:02 -08002750 __acquires(unix_table_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002751{
David S. Millerfbe9cc42005-12-13 23:26:29 -08002752 spin_lock(&unix_table_lock);
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002753
2754 if (!*pos)
2755 return SEQ_START_TOKEN;
2756
2757 if (get_bucket(*pos) >= ARRAY_SIZE(unix_socket_table))
2758 return NULL;
2759
2760 return unix_next_socket(seq, NULL, pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002761}
2762
2763static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2764{
2765 ++*pos;
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002766 return unix_next_socket(seq, v, pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002767}
2768
2769static void unix_seq_stop(struct seq_file *seq, void *v)
Eric Dumazet9a429c42008-01-01 21:58:02 -08002770 __releases(unix_table_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002771{
David S. Millerfbe9cc42005-12-13 23:26:29 -08002772 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002773}
2774
2775static int unix_seq_show(struct seq_file *seq, void *v)
2776{
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002777
Joe Perchesb9f31242008-04-12 19:04:38 -07002778 if (v == SEQ_START_TOKEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002779 seq_puts(seq, "Num RefCount Protocol Flags Type St "
2780 "Inode Path\n");
2781 else {
2782 struct sock *s = v;
2783 struct unix_sock *u = unix_sk(s);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002784 unix_state_lock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002785
Dan Rosenberg71338aa2011-05-23 12:17:35 +00002786 seq_printf(seq, "%pK: %08X %08X %08X %04X %02X %5lu",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002787 s,
Reshetova, Elena41c6d652017-06-30 13:08:01 +03002788 refcount_read(&s->sk_refcnt),
Linus Torvalds1da177e2005-04-16 15:20:36 -07002789 0,
2790 s->sk_state == TCP_LISTEN ? __SO_ACCEPTCON : 0,
2791 s->sk_type,
2792 s->sk_socket ?
2793 (s->sk_state == TCP_ESTABLISHED ? SS_CONNECTED : SS_UNCONNECTED) :
2794 (s->sk_state == TCP_ESTABLISHED ? SS_CONNECTING : SS_DISCONNECTING),
2795 sock_i_ino(s));
2796
Al Viroae3b5642019-02-15 20:09:35 +00002797 if (u->addr) { // under unix_table_lock here
Linus Torvalds1da177e2005-04-16 15:20:36 -07002798 int i, len;
2799 seq_putc(seq, ' ');
2800
2801 i = 0;
2802 len = u->addr->len - sizeof(short);
2803 if (!UNIX_ABSTRACT(s))
2804 len--;
2805 else {
2806 seq_putc(seq, '@');
2807 i++;
2808 }
2809 for ( ; i < len; i++)
Isaac Boukrise7947ea2016-11-01 02:41:35 +02002810 seq_putc(seq, u->addr->name->sun_path[i] ?:
2811 '@');
Linus Torvalds1da177e2005-04-16 15:20:36 -07002812 }
David S. Miller1c92b4e2007-05-31 13:24:26 -07002813 unix_state_unlock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002814 seq_putc(seq, '\n');
2815 }
2816
2817 return 0;
2818}
2819
Philippe De Muyter56b3d972007-07-10 23:07:31 -07002820static const struct seq_operations unix_seq_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002821 .start = unix_seq_start,
2822 .next = unix_seq_next,
2823 .stop = unix_seq_stop,
2824 .show = unix_seq_show,
2825};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002826#endif
2827
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00002828static const struct net_proto_family unix_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002829 .family = PF_UNIX,
2830 .create = unix_create,
2831 .owner = THIS_MODULE,
2832};
2833
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002834
Alexey Dobriyan2c8c1e72010-01-17 03:35:32 +00002835static int __net_init unix_net_init(struct net *net)
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002836{
2837 int error = -ENOMEM;
2838
Denis V. Luneva0a53c82007-12-11 04:19:17 -08002839 net->unx.sysctl_max_dgram_qlen = 10;
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002840 if (unix_sysctl_register(net))
2841 goto out;
Pavel Emelyanovd392e492007-12-01 23:44:15 +11002842
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002843#ifdef CONFIG_PROC_FS
Christoph Hellwigc3506372018-04-10 19:42:55 +02002844 if (!proc_create_net("unix", 0, net->proc_net, &unix_seq_ops,
2845 sizeof(struct seq_net_private))) {
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002846 unix_sysctl_unregister(net);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002847 goto out;
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002848 }
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002849#endif
2850 error = 0;
2851out:
Jianjun Kong48dcc33e2008-11-01 21:37:27 -07002852 return error;
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002853}
2854
Alexey Dobriyan2c8c1e72010-01-17 03:35:32 +00002855static void __net_exit unix_net_exit(struct net *net)
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002856{
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002857 unix_sysctl_unregister(net);
Gao fengece31ff2013-02-18 01:34:56 +00002858 remove_proc_entry("unix", net->proc_net);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002859}
2860
2861static struct pernet_operations unix_net_ops = {
2862 .init = unix_net_init,
2863 .exit = unix_net_exit,
2864};
2865
Linus Torvalds1da177e2005-04-16 15:20:36 -07002866static int __init af_unix_init(void)
2867{
2868 int rc = -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869
YOSHIFUJI Hideaki / 吉藤英明b4fff5f2013-01-09 07:20:07 +00002870 BUILD_BUG_ON(sizeof(struct unix_skb_parms) > FIELD_SIZEOF(struct sk_buff, cb));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871
2872 rc = proto_register(&unix_proto, 1);
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002873 if (rc != 0) {
wangweidong5cc208b2013-12-06 18:03:36 +08002874 pr_crit("%s: Cannot create unix_sock SLAB cache!\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875 goto out;
2876 }
2877
2878 sock_register(&unix_family_ops);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002879 register_pernet_subsys(&unix_net_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002880out:
2881 return rc;
2882}
2883
2884static void __exit af_unix_exit(void)
2885{
2886 sock_unregister(PF_UNIX);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002887 proto_unregister(&unix_proto);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002888 unregister_pernet_subsys(&unix_net_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889}
2890
David Woodhouse3d366962008-04-24 00:59:25 -07002891/* Earlier than device_initcall() so that other drivers invoking
2892 request_module() don't end up in a loop when modprobe tries
2893 to use a UNIX socket. But later than subsys_initcall() because
2894 we depend on stuff initialised there */
2895fs_initcall(af_unix_init);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896module_exit(af_unix_exit);
2897
2898MODULE_LICENSE("GPL");
2899MODULE_ALIAS_NETPROTO(PF_UNIX);