blob: 774babbee045ff2649a078d212487c92c0932c1a [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))
Vito Caputo262ce0a2019-10-09 20:43:47 -0700287 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288 }
Vito Caputo262ce0a2019-10-09 20:43:47 -0700289 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700290}
291
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800292static inline struct sock *unix_find_socket_byname(struct net *net,
293 struct sockaddr_un *sunname,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294 int len, int type,
Eric Dumazet95c96172012-04-15 05:58:06 +0000295 unsigned int hash)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296{
297 struct sock *s;
298
David S. Millerfbe9cc42005-12-13 23:26:29 -0800299 spin_lock(&unix_table_lock);
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800300 s = __unix_find_socket_byname(net, sunname, len, type, hash);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301 if (s)
302 sock_hold(s);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800303 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700304 return s;
305}
306
Eric W. Biederman6616f782010-06-13 03:35:48 +0000307static struct sock *unix_find_socket_byinode(struct inode *i)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308{
309 struct sock *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310
David S. Millerfbe9cc42005-12-13 23:26:29 -0800311 spin_lock(&unix_table_lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -0800312 sk_for_each(s,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313 &unix_socket_table[i->i_ino & (UNIX_HASH_SIZE - 1)]) {
Al Viro40ffe672012-03-14 21:54:32 -0400314 struct dentry *dentry = unix_sk(s)->path.dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315
Miklos Szeredibeef5122016-12-16 11:02:53 +0100316 if (dentry && d_backing_inode(dentry) == i) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317 sock_hold(s);
318 goto found;
319 }
320 }
321 s = NULL;
322found:
David S. Millerfbe9cc42005-12-13 23:26:29 -0800323 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700324 return s;
325}
326
Rainer Weikusat7d267272015-11-20 22:07:23 +0000327/* Support code for asymmetrically connected dgram sockets
328 *
329 * If a datagram socket is connected to a socket not itself connected
330 * to the first socket (eg, /dev/log), clients may only enqueue more
331 * messages if the present receive queue of the server socket is not
332 * "too large". This means there's a second writeability condition
333 * poll and sendmsg need to test. The dgram recv code will do a wake
334 * up on the peer_wait wait queue of a socket upon reception of a
335 * datagram which needs to be propagated to sleeping would-be writers
336 * since these might not have sent anything so far. This can't be
337 * accomplished via poll_wait because the lifetime of the server
338 * socket might be less than that of its clients if these break their
339 * association with it or if the server socket is closed while clients
340 * are still connected to it and there's no way to inform "a polling
341 * implementation" that it should let go of a certain wait queue
342 *
Ingo Molnarac6424b2017-06-20 12:06:13 +0200343 * In order to propagate a wake up, a wait_queue_entry_t of the client
Rainer Weikusat7d267272015-11-20 22:07:23 +0000344 * socket is enqueued on the peer_wait queue of the server socket
345 * whose wake function does a wake_up on the ordinary client socket
346 * wait queue. This connection is established whenever a write (or
347 * poll for write) hit the flow control condition and broken when the
348 * association to the server socket is dissolved or after a wake up
349 * was relayed.
350 */
351
Ingo Molnarac6424b2017-06-20 12:06:13 +0200352static int unix_dgram_peer_wake_relay(wait_queue_entry_t *q, unsigned mode, int flags,
Rainer Weikusat7d267272015-11-20 22:07:23 +0000353 void *key)
354{
355 struct unix_sock *u;
356 wait_queue_head_t *u_sleep;
357
358 u = container_of(q, struct unix_sock, peer_wake);
359
360 __remove_wait_queue(&unix_sk(u->peer_wake.private)->peer_wait,
361 q);
362 u->peer_wake.private = NULL;
363
364 /* relaying can only happen while the wq still exists */
365 u_sleep = sk_sleep(&u->sk);
366 if (u_sleep)
Al Viro3ad6f932017-07-03 20:14:56 -0400367 wake_up_interruptible_poll(u_sleep, key_to_poll(key));
Rainer Weikusat7d267272015-11-20 22:07:23 +0000368
369 return 0;
370}
371
372static int unix_dgram_peer_wake_connect(struct sock *sk, struct sock *other)
373{
374 struct unix_sock *u, *u_other;
375 int rc;
376
377 u = unix_sk(sk);
378 u_other = unix_sk(other);
379 rc = 0;
380 spin_lock(&u_other->peer_wait.lock);
381
382 if (!u->peer_wake.private) {
383 u->peer_wake.private = other;
384 __add_wait_queue(&u_other->peer_wait, &u->peer_wake);
385
386 rc = 1;
387 }
388
389 spin_unlock(&u_other->peer_wait.lock);
390 return rc;
391}
392
393static void unix_dgram_peer_wake_disconnect(struct sock *sk,
394 struct sock *other)
395{
396 struct unix_sock *u, *u_other;
397
398 u = unix_sk(sk);
399 u_other = unix_sk(other);
400 spin_lock(&u_other->peer_wait.lock);
401
402 if (u->peer_wake.private == other) {
403 __remove_wait_queue(&u_other->peer_wait, &u->peer_wake);
404 u->peer_wake.private = NULL;
405 }
406
407 spin_unlock(&u_other->peer_wait.lock);
408}
409
410static void unix_dgram_peer_wake_disconnect_wakeup(struct sock *sk,
411 struct sock *other)
412{
413 unix_dgram_peer_wake_disconnect(sk, other);
414 wake_up_interruptible_poll(sk_sleep(sk),
Linus Torvaldsa9a08842018-02-11 14:34:03 -0800415 EPOLLOUT |
416 EPOLLWRNORM |
417 EPOLLWRBAND);
Rainer Weikusat7d267272015-11-20 22:07:23 +0000418}
419
420/* preconditions:
421 * - unix_peer(sk) == other
422 * - association is stable
423 */
424static int unix_dgram_peer_wake_me(struct sock *sk, struct sock *other)
425{
426 int connected;
427
428 connected = unix_dgram_peer_wake_connect(sk, other);
429
Jason Baron51f7e952018-08-03 17:24:53 -0400430 /* If other is SOCK_DEAD, we want to make sure we signal
431 * POLLOUT, such that a subsequent write() can get a
432 * -ECONNREFUSED. Otherwise, if we haven't queued any skbs
433 * to other and its full, we will hang waiting for POLLOUT.
434 */
435 if (unix_recvq_full(other) && !sock_flag(other, SOCK_DEAD))
Rainer Weikusat7d267272015-11-20 22:07:23 +0000436 return 1;
437
438 if (connected)
439 unix_dgram_peer_wake_disconnect(sk, other);
440
441 return 0;
442}
443
Eric Dumazet1586a582015-10-23 10:59:16 -0700444static int unix_writable(const struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445{
Eric Dumazet1586a582015-10-23 10:59:16 -0700446 return sk->sk_state != TCP_LISTEN &&
Reshetova, Elena14afee42017-06-30 13:08:00 +0300447 (refcount_read(&sk->sk_wmem_alloc) << 2) <= sk->sk_sndbuf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448}
449
450static void unix_write_space(struct sock *sk)
451{
Eric Dumazet43815482010-04-29 11:01:49 +0000452 struct socket_wq *wq;
453
454 rcu_read_lock();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700455 if (unix_writable(sk)) {
Eric Dumazet43815482010-04-29 11:01:49 +0000456 wq = rcu_dereference(sk->sk_wq);
Herbert Xu1ce0bf52015-11-26 13:55:39 +0800457 if (skwq_has_sleeper(wq))
Eric Dumazet67426b72010-10-29 20:44:44 +0000458 wake_up_interruptible_sync_poll(&wq->wait,
Linus Torvaldsa9a08842018-02-11 14:34:03 -0800459 EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND);
Pavel Emelyanov8d8ad9d2007-11-26 20:10:50 +0800460 sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461 }
Eric Dumazet43815482010-04-29 11:01:49 +0000462 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463}
464
465/* When dgram socket disconnects (or changes its peer), we clear its receive
466 * queue of packets arrived from previous peer. First, it allows to do
467 * flow control based only on wmem_alloc; second, sk connected to peer
468 * may receive messages only from that peer. */
469static void unix_dgram_disconnected(struct sock *sk, struct sock *other)
470{
David S. Millerb03efcf2005-07-08 14:57:23 -0700471 if (!skb_queue_empty(&sk->sk_receive_queue)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472 skb_queue_purge(&sk->sk_receive_queue);
473 wake_up_interruptible_all(&unix_sk(sk)->peer_wait);
474
475 /* If one link of bidirectional dgram pipe is disconnected,
476 * we signal error. Messages are lost. Do not make this,
477 * when peer was not connected to us.
478 */
479 if (!sock_flag(other, SOCK_DEAD) && unix_peer(other) == sk) {
480 other->sk_err = ECONNRESET;
481 other->sk_error_report(other);
482 }
483 }
484}
485
486static void unix_sock_destructor(struct sock *sk)
487{
488 struct unix_sock *u = unix_sk(sk);
489
490 skb_queue_purge(&sk->sk_receive_queue);
491
Reshetova, Elena14afee42017-06-30 13:08:00 +0300492 WARN_ON(refcount_read(&sk->sk_wmem_alloc));
Ilpo Järvinen547b7922008-07-25 21:43:18 -0700493 WARN_ON(!sk_unhashed(sk));
494 WARN_ON(sk->sk_socket);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495 if (!sock_flag(sk, SOCK_DEAD)) {
wangweidong5cc208b2013-12-06 18:03:36 +0800496 pr_info("Attempt to release alive unix socket: %p\n", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497 return;
498 }
499
500 if (u->addr)
501 unix_release_addr(u->addr);
502
Eric Dumazet518de9b2010-10-26 14:22:44 -0700503 atomic_long_dec(&unix_nr_socks);
David S. Miller6f756a82008-11-23 17:34:03 -0800504 local_bh_disable();
Eric Dumazeta8076d82008-11-17 02:38:49 -0800505 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
David S. Miller6f756a82008-11-23 17:34:03 -0800506 local_bh_enable();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507#ifdef UNIX_REFCNT_DEBUG
wangweidong5cc208b2013-12-06 18:03:36 +0800508 pr_debug("UNIX %p is destroyed, %ld are still alive.\n", sk,
Eric Dumazet518de9b2010-10-26 14:22:44 -0700509 atomic_long_read(&unix_nr_socks));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510#endif
511}
512
Paul Mooreded34e02013-03-25 03:18:33 +0000513static void unix_release_sock(struct sock *sk, int embrion)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514{
515 struct unix_sock *u = unix_sk(sk);
Al Viro40ffe672012-03-14 21:54:32 -0400516 struct path path;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517 struct sock *skpair;
518 struct sk_buff *skb;
519 int state;
520
521 unix_remove_socket(sk);
522
523 /* Clear state */
David S. Miller1c92b4e2007-05-31 13:24:26 -0700524 unix_state_lock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700525 sock_orphan(sk);
526 sk->sk_shutdown = SHUTDOWN_MASK;
Al Viro40ffe672012-03-14 21:54:32 -0400527 path = u->path;
528 u->path.dentry = NULL;
529 u->path.mnt = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700530 state = sk->sk_state;
531 sk->sk_state = TCP_CLOSE;
David S. Miller1c92b4e2007-05-31 13:24:26 -0700532 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700533
534 wake_up_interruptible_all(&u->peer_wait);
535
Jianjun Konge27dfce2008-11-01 21:38:31 -0700536 skpair = unix_peer(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537
Jianjun Konge27dfce2008-11-01 21:38:31 -0700538 if (skpair != NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) {
David S. Miller1c92b4e2007-05-31 13:24:26 -0700540 unix_state_lock(skpair);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 /* No more writes */
542 skpair->sk_shutdown = SHUTDOWN_MASK;
543 if (!skb_queue_empty(&sk->sk_receive_queue) || embrion)
544 skpair->sk_err = ECONNRESET;
David S. Miller1c92b4e2007-05-31 13:24:26 -0700545 unix_state_unlock(skpair);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700546 skpair->sk_state_change(skpair);
Pavel Emelyanov8d8ad9d2007-11-26 20:10:50 +0800547 sk_wake_async(skpair, SOCK_WAKE_WAITD, POLL_HUP);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 }
Rainer Weikusat7d267272015-11-20 22:07:23 +0000549
550 unix_dgram_peer_wake_disconnect(sk, skpair);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551 sock_put(skpair); /* It may now die */
552 unix_peer(sk) = NULL;
553 }
554
555 /* Try to flush out this socket. Throw out buffers at least */
556
557 while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
Jianjun Konge27dfce2008-11-01 21:38:31 -0700558 if (state == TCP_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559 unix_release_sock(skb->sk, 1);
560 /* passed fds are erased in the kfree_skb hook */
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +0100561 UNIXCB(skb).consumed = skb->len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 kfree_skb(skb);
563 }
564
Al Viro40ffe672012-03-14 21:54:32 -0400565 if (path.dentry)
566 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567
568 sock_put(sk);
569
570 /* ---- Socket is dead now and most probably destroyed ---- */
571
572 /*
Alan Coxe04dae82012-09-17 00:52:41 +0000573 * Fixme: BSD difference: In BSD all sockets connected to us get
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574 * ECONNRESET and we die on the spot. In Linux we behave
575 * like files and pipes do and wait for the last
576 * dereference.
577 *
578 * Can't we simply set sock->err?
579 *
580 * What the above comment does talk about? --ANK(980817)
581 */
582
Pavel Emelyanov9305cfa2007-11-10 22:06:01 -0800583 if (unix_tot_inflight)
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +0900584 unix_gc(); /* Garbage collect fds */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585}
586
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000587static void init_peercred(struct sock *sk)
588{
589 put_pid(sk->sk_peer_pid);
590 if (sk->sk_peer_cred)
591 put_cred(sk->sk_peer_cred);
592 sk->sk_peer_pid = get_pid(task_tgid(current));
593 sk->sk_peer_cred = get_current_cred();
594}
595
596static void copy_peercred(struct sock *sk, struct sock *peersk)
597{
598 put_pid(sk->sk_peer_pid);
599 if (sk->sk_peer_cred)
600 put_cred(sk->sk_peer_cred);
601 sk->sk_peer_pid = get_pid(peersk->sk_peer_pid);
602 sk->sk_peer_cred = get_cred(peersk->sk_peer_cred);
603}
604
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605static int unix_listen(struct socket *sock, int backlog)
606{
607 int err;
608 struct sock *sk = sock->sk;
609 struct unix_sock *u = unix_sk(sk);
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000610 struct pid *old_pid = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700611
612 err = -EOPNOTSUPP;
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800613 if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
614 goto out; /* Only stream/seqpacket sockets accept */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700615 err = -EINVAL;
616 if (!u->addr)
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800617 goto out; /* No listens on an unbound socket */
David S. Miller1c92b4e2007-05-31 13:24:26 -0700618 unix_state_lock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700619 if (sk->sk_state != TCP_CLOSE && sk->sk_state != TCP_LISTEN)
620 goto out_unlock;
621 if (backlog > sk->sk_max_ack_backlog)
622 wake_up_interruptible_all(&u->peer_wait);
623 sk->sk_max_ack_backlog = backlog;
624 sk->sk_state = TCP_LISTEN;
625 /* set credentials so connect can copy them */
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000626 init_peercred(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627 err = 0;
628
629out_unlock:
David S. Miller1c92b4e2007-05-31 13:24:26 -0700630 unix_state_unlock(sk);
Eric W. Biederman109f6e32010-06-13 03:30:14 +0000631 put_pid(old_pid);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632out:
633 return err;
634}
635
636static int unix_release(struct socket *);
637static int unix_bind(struct socket *, struct sockaddr *, int);
638static int unix_stream_connect(struct socket *, struct sockaddr *,
639 int addr_len, int flags);
640static int unix_socketpair(struct socket *, struct socket *);
David Howellscdfbabf2017-03-09 08:09:05 +0000641static int unix_accept(struct socket *, struct socket *, int, bool);
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100642static int unix_getname(struct socket *, struct sockaddr *, int);
Linus Torvaldsa11e1d42018-06-28 09:43:44 -0700643static __poll_t unix_poll(struct file *, struct socket *, poll_table *);
644static __poll_t unix_dgram_poll(struct file *, struct socket *,
645 poll_table *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646static int unix_ioctl(struct socket *, unsigned int, unsigned long);
Arnd Bergmann5f6beb92019-06-03 22:03:44 +0200647#ifdef CONFIG_COMPAT
648static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
649#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650static int unix_shutdown(struct socket *, int);
Ying Xue1b784142015-03-02 15:37:48 +0800651static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);
652static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, int);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +0200653static ssize_t unix_stream_sendpage(struct socket *, struct page *, int offset,
654 size_t size, int flags);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +0200655static ssize_t unix_stream_splice_read(struct socket *, loff_t *ppos,
656 struct pipe_inode_info *, size_t size,
657 unsigned int flags);
Ying Xue1b784142015-03-02 15:37:48 +0800658static int unix_dgram_sendmsg(struct socket *, struct msghdr *, size_t);
659static int unix_dgram_recvmsg(struct socket *, struct msghdr *, size_t, int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660static int unix_dgram_connect(struct socket *, struct sockaddr *,
661 int, int);
Ying Xue1b784142015-03-02 15:37:48 +0800662static int unix_seqpacket_sendmsg(struct socket *, struct msghdr *, size_t);
663static int unix_seqpacket_recvmsg(struct socket *, struct msghdr *, size_t,
664 int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700665
Sasha Levin12663bf2013-12-07 17:26:27 -0500666static int unix_set_peek_off(struct sock *sk, int val)
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000667{
668 struct unix_sock *u = unix_sk(sk);
669
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700670 if (mutex_lock_interruptible(&u->iolock))
Sasha Levin12663bf2013-12-07 17:26:27 -0500671 return -EINTR;
672
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000673 sk->sk_peek_off = val;
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700674 mutex_unlock(&u->iolock);
Sasha Levin12663bf2013-12-07 17:26:27 -0500675
676 return 0;
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000677}
678
679
Eric Dumazet90ddc4f2005-12-22 12:49:22 -0800680static const struct proto_ops unix_stream_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 .family = PF_UNIX,
682 .owner = THIS_MODULE,
683 .release = unix_release,
684 .bind = unix_bind,
685 .connect = unix_stream_connect,
686 .socketpair = unix_socketpair,
687 .accept = unix_accept,
688 .getname = unix_getname,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -0700689 .poll = unix_poll,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690 .ioctl = unix_ioctl,
Arnd Bergmann5f6beb92019-06-03 22:03:44 +0200691#ifdef CONFIG_COMPAT
692 .compat_ioctl = unix_compat_ioctl,
693#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 .listen = unix_listen,
695 .shutdown = unix_shutdown,
696 .setsockopt = sock_no_setsockopt,
697 .getsockopt = sock_no_getsockopt,
698 .sendmsg = unix_stream_sendmsg,
699 .recvmsg = unix_stream_recvmsg,
700 .mmap = sock_no_mmap,
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +0200701 .sendpage = unix_stream_sendpage,
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +0200702 .splice_read = unix_stream_splice_read,
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +0000703 .set_peek_off = unix_set_peek_off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704};
705
Eric Dumazet90ddc4f2005-12-22 12:49:22 -0800706static const struct proto_ops unix_dgram_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700707 .family = PF_UNIX,
708 .owner = THIS_MODULE,
709 .release = unix_release,
710 .bind = unix_bind,
711 .connect = unix_dgram_connect,
712 .socketpair = unix_socketpair,
713 .accept = sock_no_accept,
714 .getname = unix_getname,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -0700715 .poll = unix_dgram_poll,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 .ioctl = unix_ioctl,
Arnd Bergmann5f6beb92019-06-03 22:03:44 +0200717#ifdef CONFIG_COMPAT
718 .compat_ioctl = unix_compat_ioctl,
719#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720 .listen = sock_no_listen,
721 .shutdown = unix_shutdown,
722 .setsockopt = sock_no_setsockopt,
723 .getsockopt = sock_no_getsockopt,
724 .sendmsg = unix_dgram_sendmsg,
725 .recvmsg = unix_dgram_recvmsg,
726 .mmap = sock_no_mmap,
727 .sendpage = sock_no_sendpage,
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000728 .set_peek_off = unix_set_peek_off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729};
730
Eric Dumazet90ddc4f2005-12-22 12:49:22 -0800731static const struct proto_ops unix_seqpacket_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732 .family = PF_UNIX,
733 .owner = THIS_MODULE,
734 .release = unix_release,
735 .bind = unix_bind,
736 .connect = unix_stream_connect,
737 .socketpair = unix_socketpair,
738 .accept = unix_accept,
739 .getname = unix_getname,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -0700740 .poll = unix_dgram_poll,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741 .ioctl = unix_ioctl,
Arnd Bergmann5f6beb92019-06-03 22:03:44 +0200742#ifdef CONFIG_COMPAT
743 .compat_ioctl = unix_compat_ioctl,
744#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700745 .listen = unix_listen,
746 .shutdown = unix_shutdown,
747 .setsockopt = sock_no_setsockopt,
748 .getsockopt = sock_no_getsockopt,
749 .sendmsg = unix_seqpacket_sendmsg,
Eric W. Biedermana05d2ad2011-04-24 01:54:57 +0000750 .recvmsg = unix_seqpacket_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751 .mmap = sock_no_mmap,
752 .sendpage = sock_no_sendpage,
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +0000753 .set_peek_off = unix_set_peek_off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754};
755
756static struct proto unix_proto = {
Eric Dumazet248969a2008-11-17 00:00:30 -0800757 .name = "UNIX",
758 .owner = THIS_MODULE,
Eric Dumazet248969a2008-11-17 00:00:30 -0800759 .obj_size = sizeof(struct unix_sock),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760};
761
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500762static struct sock *unix_create1(struct net *net, struct socket *sock, int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700763{
764 struct sock *sk = NULL;
765 struct unix_sock *u;
766
Eric Dumazet518de9b2010-10-26 14:22:44 -0700767 atomic_long_inc(&unix_nr_socks);
768 if (atomic_long_read(&unix_nr_socks) > 2 * get_max_files())
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769 goto out;
770
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500771 sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto, kern);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772 if (!sk)
773 goto out;
774
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800775 sock_init_data(sock, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776
Vladimir Davydov3aa97992016-07-26 15:24:36 -0700777 sk->sk_allocation = GFP_KERNEL_ACCOUNT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700778 sk->sk_write_space = unix_write_space;
Denis V. Luneva0a53c82007-12-11 04:19:17 -0800779 sk->sk_max_ack_backlog = net->unx.sysctl_max_dgram_qlen;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780 sk->sk_destruct = unix_sock_destructor;
781 u = unix_sk(sk);
Al Viro40ffe672012-03-14 21:54:32 -0400782 u->path.dentry = NULL;
783 u->path.mnt = NULL;
Benjamin LaHaisefd19f322006-01-03 14:10:46 -0800784 spin_lock_init(&u->lock);
Al Viro516e0cc2008-07-26 00:39:17 -0400785 atomic_long_set(&u->inflight, 0);
Miklos Szeredi1fd05ba2007-07-11 14:22:39 -0700786 INIT_LIST_HEAD(&u->link);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700787 mutex_init(&u->iolock); /* single task reading lock */
788 mutex_init(&u->bindlock); /* single task binding lock */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 init_waitqueue_head(&u->peer_wait);
Rainer Weikusat7d267272015-11-20 22:07:23 +0000790 init_waitqueue_func_entry(&u->peer_wake, unix_dgram_peer_wake_relay);
Eric Dumazet7123aaa2012-06-08 05:03:21 +0000791 unix_insert_socket(unix_sockets_unbound(sk), sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792out:
Pavel Emelyanov284b3272007-11-10 22:08:30 -0800793 if (sk == NULL)
Eric Dumazet518de9b2010-10-26 14:22:44 -0700794 atomic_long_dec(&unix_nr_socks);
Eric Dumazet920de802008-11-24 00:09:29 -0800795 else {
796 local_bh_disable();
Eric Dumazeta8076d82008-11-17 02:38:49 -0800797 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
Eric Dumazet920de802008-11-24 00:09:29 -0800798 local_bh_enable();
799 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800 return sk;
801}
802
Eric Paris3f378b62009-11-05 22:18:14 -0800803static int unix_create(struct net *net, struct socket *sock, int protocol,
804 int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805{
806 if (protocol && protocol != PF_UNIX)
807 return -EPROTONOSUPPORT;
808
809 sock->state = SS_UNCONNECTED;
810
811 switch (sock->type) {
812 case SOCK_STREAM:
813 sock->ops = &unix_stream_ops;
814 break;
815 /*
816 * Believe it or not BSD has AF_UNIX, SOCK_RAW though
817 * nothing uses it.
818 */
819 case SOCK_RAW:
Jianjun Konge27dfce2008-11-01 21:38:31 -0700820 sock->type = SOCK_DGRAM;
Gustavo A. R. Silva110af3a2017-10-20 12:05:30 -0500821 /* fall through */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822 case SOCK_DGRAM:
823 sock->ops = &unix_dgram_ops;
824 break;
825 case SOCK_SEQPACKET:
826 sock->ops = &unix_seqpacket_ops;
827 break;
828 default:
829 return -ESOCKTNOSUPPORT;
830 }
831
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500832 return unix_create1(net, sock, kern) ? 0 : -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833}
834
835static int unix_release(struct socket *sock)
836{
837 struct sock *sk = sock->sk;
838
839 if (!sk)
840 return 0;
841
Paul Mooreded34e02013-03-25 03:18:33 +0000842 unix_release_sock(sk, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700843 sock->sk = NULL;
844
Paul Mooreded34e02013-03-25 03:18:33 +0000845 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700846}
847
848static int unix_autobind(struct socket *sock)
849{
850 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +0900851 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700852 struct unix_sock *u = unix_sk(sk);
853 static u32 ordernum = 1;
Eric Dumazet6eba6a32008-11-16 22:58:44 -0800854 struct unix_address *addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700855 int err;
Tetsuo Handa8df73ff2010-09-04 01:34:28 +0000856 unsigned int retries = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700857
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700858 err = mutex_lock_interruptible(&u->bindlock);
Sasha Levin37ab4fa2013-12-13 10:54:22 -0500859 if (err)
860 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861
862 err = 0;
863 if (u->addr)
864 goto out;
865
866 err = -ENOMEM;
Panagiotis Issaris0da974f2006-07-21 14:51:30 -0700867 addr = kzalloc(sizeof(*addr) + sizeof(short) + 16, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868 if (!addr)
869 goto out;
870
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871 addr->name->sun_family = AF_UNIX;
Reshetova, Elena8c9814b2017-06-30 13:08:05 +0300872 refcount_set(&addr->refcnt, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700873
874retry:
875 addr->len = sprintf(addr->name->sun_path+1, "%05x", ordernum) + 1 + sizeof(short);
Joe Perches07f07572008-11-19 15:44:53 -0800876 addr->hash = unix_hash_fold(csum_partial(addr->name, addr->len, 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877
David S. Millerfbe9cc42005-12-13 23:26:29 -0800878 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700879 ordernum = (ordernum+1)&0xFFFFF;
880
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800881 if (__unix_find_socket_byname(net, addr->name, addr->len, sock->type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 addr->hash)) {
David S. Millerfbe9cc42005-12-13 23:26:29 -0800883 spin_unlock(&unix_table_lock);
Tetsuo Handa8df73ff2010-09-04 01:34:28 +0000884 /*
885 * __unix_find_socket_byname() may take long time if many names
886 * are already in use.
887 */
888 cond_resched();
889 /* Give up if all names seems to be in use. */
890 if (retries++ == 0xFFFFF) {
891 err = -ENOSPC;
892 kfree(addr);
893 goto out;
894 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 goto retry;
896 }
897 addr->hash ^= sk->sk_type;
898
899 __unix_remove_socket(sk);
Al Viroae3b5642019-02-15 20:09:35 +0000900 smp_store_release(&u->addr, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 __unix_insert_socket(&unix_socket_table[addr->hash], sk);
David S. Millerfbe9cc42005-12-13 23:26:29 -0800902 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903 err = 0;
904
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -0700905out: mutex_unlock(&u->bindlock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 return err;
907}
908
Denis V. Lunev097e66c2007-11-19 22:29:30 -0800909static struct sock *unix_find_other(struct net *net,
910 struct sockaddr_un *sunname, int len,
Eric Dumazet95c96172012-04-15 05:58:06 +0000911 int type, unsigned int hash, int *error)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912{
913 struct sock *u;
Al Viro421748e2008-08-02 01:04:36 -0400914 struct path path;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915 int err = 0;
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +0900916
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917 if (sunname->sun_path[0]) {
Al Viro421748e2008-08-02 01:04:36 -0400918 struct inode *inode;
919 err = kern_path(sunname->sun_path, LOOKUP_FOLLOW, &path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920 if (err)
921 goto fail;
Miklos Szeredibeef5122016-12-16 11:02:53 +0100922 inode = d_backing_inode(path.dentry);
Al Viro421748e2008-08-02 01:04:36 -0400923 err = inode_permission(inode, MAY_WRITE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924 if (err)
925 goto put_fail;
926
927 err = -ECONNREFUSED;
Al Viro421748e2008-08-02 01:04:36 -0400928 if (!S_ISSOCK(inode->i_mode))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700929 goto put_fail;
Eric W. Biederman6616f782010-06-13 03:35:48 +0000930 u = unix_find_socket_byinode(inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931 if (!u)
932 goto put_fail;
933
934 if (u->sk_type == type)
Al Viro68ac1232012-03-15 08:21:57 -0400935 touch_atime(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936
Al Viro421748e2008-08-02 01:04:36 -0400937 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938
Jianjun Konge27dfce2008-11-01 21:38:31 -0700939 err = -EPROTOTYPE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700940 if (u->sk_type != type) {
941 sock_put(u);
942 goto fail;
943 }
944 } else {
945 err = -ECONNREFUSED;
Jianjun Konge27dfce2008-11-01 21:38:31 -0700946 u = unix_find_socket_byname(net, sunname, len, type, hash);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700947 if (u) {
948 struct dentry *dentry;
Al Viro40ffe672012-03-14 21:54:32 -0400949 dentry = unix_sk(u)->path.dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950 if (dentry)
Al Viro68ac1232012-03-15 08:21:57 -0400951 touch_atime(&unix_sk(u)->path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952 } else
953 goto fail;
954 }
955 return u;
956
957put_fail:
Al Viro421748e2008-08-02 01:04:36 -0400958 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959fail:
Jianjun Konge27dfce2008-11-01 21:38:31 -0700960 *error = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700961 return NULL;
962}
963
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700964static int unix_mknod(const char *sun_path, umode_t mode, struct path *res)
Al Virofaf02012012-07-20 02:37:29 +0400965{
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700966 struct dentry *dentry;
967 struct path path;
968 int err = 0;
969 /*
970 * Get the parent directory, calculate the hash for last
971 * component.
972 */
973 dentry = kern_path_create(AT_FDCWD, sun_path, &path, 0);
974 err = PTR_ERR(dentry);
975 if (IS_ERR(dentry))
976 return err;
Al Virofaf02012012-07-20 02:37:29 +0400977
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700978 /*
979 * All right, let's create it.
980 */
981 err = security_path_mknod(&path, dentry, mode, 0);
Al Virofaf02012012-07-20 02:37:29 +0400982 if (!err) {
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700983 err = vfs_mknod(d_inode(path.dentry), dentry, mode, 0);
Al Virofaf02012012-07-20 02:37:29 +0400984 if (!err) {
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700985 res->mnt = mntget(path.mnt);
Al Virofaf02012012-07-20 02:37:29 +0400986 res->dentry = dget(dentry);
987 }
988 }
Linus Torvalds38f7bd942016-09-01 14:56:49 -0700989 done_path_create(&path, dentry);
Al Virofaf02012012-07-20 02:37:29 +0400990 return err;
991}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700992
993static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
994{
995 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +0900996 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997 struct unix_sock *u = unix_sk(sk);
Jianjun Konge27dfce2008-11-01 21:38:31 -0700998 struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
Al Virodae6ad82011-06-26 11:50:15 -0400999 char *sun_path = sunaddr->sun_path;
Linus Torvalds38f7bd942016-09-01 14:56:49 -07001000 int err;
Eric Dumazet95c96172012-04-15 05:58:06 +00001001 unsigned int hash;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001002 struct unix_address *addr;
1003 struct hlist_head *list;
Kees Cook82fe0d22017-04-04 22:12:09 -07001004 struct path path = { };
Linus Torvalds1da177e2005-04-16 15:20:36 -07001005
1006 err = -EINVAL;
Mateusz Jurczykdefbcf22017-06-08 11:13:36 +02001007 if (addr_len < offsetofend(struct sockaddr_un, sun_family) ||
1008 sunaddr->sun_family != AF_UNIX)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009 goto out;
1010
Jianjun Konge27dfce2008-11-01 21:38:31 -07001011 if (addr_len == sizeof(short)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 err = unix_autobind(sock);
1013 goto out;
1014 }
1015
1016 err = unix_mkname(sunaddr, addr_len, &hash);
1017 if (err < 0)
1018 goto out;
1019 addr_len = err;
1020
WANG Cong0fb44552017-01-23 11:17:35 -08001021 if (sun_path[0]) {
1022 umode_t mode = S_IFSOCK |
1023 (SOCK_INODE(sock)->i_mode & ~current_umask());
1024 err = unix_mknod(sun_path, mode, &path);
1025 if (err) {
1026 if (err == -EEXIST)
1027 err = -EADDRINUSE;
1028 goto out;
1029 }
1030 }
1031
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001032 err = mutex_lock_interruptible(&u->bindlock);
Sasha Levin37ab4fa2013-12-13 10:54:22 -05001033 if (err)
WANG Cong0fb44552017-01-23 11:17:35 -08001034 goto out_put;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035
1036 err = -EINVAL;
1037 if (u->addr)
1038 goto out_up;
1039
1040 err = -ENOMEM;
1041 addr = kmalloc(sizeof(*addr)+addr_len, GFP_KERNEL);
1042 if (!addr)
1043 goto out_up;
1044
1045 memcpy(addr->name, sunaddr, addr_len);
1046 addr->len = addr_len;
1047 addr->hash = hash ^ sk->sk_type;
Reshetova, Elena8c9814b2017-06-30 13:08:05 +03001048 refcount_set(&addr->refcnt, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049
Linus Torvalds38f7bd942016-09-01 14:56:49 -07001050 if (sun_path[0]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051 addr->hash = UNIX_HASH_SIZE;
Miklos Szeredibeef5122016-12-16 11:02:53 +01001052 hash = d_backing_inode(path.dentry)->i_ino & (UNIX_HASH_SIZE - 1);
Al Virofaf02012012-07-20 02:37:29 +04001053 spin_lock(&unix_table_lock);
Linus Torvalds38f7bd942016-09-01 14:56:49 -07001054 u->path = path;
Al Virofaf02012012-07-20 02:37:29 +04001055 list = &unix_socket_table[hash];
1056 } else {
1057 spin_lock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 err = -EADDRINUSE;
Denis V. Lunev097e66c2007-11-19 22:29:30 -08001059 if (__unix_find_socket_byname(net, sunaddr, addr_len,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060 sk->sk_type, hash)) {
1061 unix_release_addr(addr);
1062 goto out_unlock;
1063 }
1064
1065 list = &unix_socket_table[addr->hash];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 }
1067
1068 err = 0;
1069 __unix_remove_socket(sk);
Al Viroae3b5642019-02-15 20:09:35 +00001070 smp_store_release(&u->addr, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071 __unix_insert_socket(list, sk);
1072
1073out_unlock:
David S. Millerfbe9cc42005-12-13 23:26:29 -08001074 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075out_up:
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001076 mutex_unlock(&u->bindlock);
WANG Cong0fb44552017-01-23 11:17:35 -08001077out_put:
1078 if (err)
1079 path_put(&path);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080out:
1081 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082}
1083
David S. Miller278a3de2007-05-31 15:19:20 -07001084static void unix_state_double_lock(struct sock *sk1, struct sock *sk2)
1085{
1086 if (unlikely(sk1 == sk2) || !sk2) {
1087 unix_state_lock(sk1);
1088 return;
1089 }
1090 if (sk1 < sk2) {
1091 unix_state_lock(sk1);
1092 unix_state_lock_nested(sk2);
1093 } else {
1094 unix_state_lock(sk2);
1095 unix_state_lock_nested(sk1);
1096 }
1097}
1098
1099static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2)
1100{
1101 if (unlikely(sk1 == sk2) || !sk2) {
1102 unix_state_unlock(sk1);
1103 return;
1104 }
1105 unix_state_unlock(sk1);
1106 unix_state_unlock(sk2);
1107}
1108
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
1110 int alen, int flags)
1111{
1112 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001113 struct net *net = sock_net(sk);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001114 struct sockaddr_un *sunaddr = (struct sockaddr_un *)addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001115 struct sock *other;
Eric Dumazet95c96172012-04-15 05:58:06 +00001116 unsigned int hash;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001117 int err;
1118
Mateusz Jurczykdefbcf22017-06-08 11:13:36 +02001119 err = -EINVAL;
1120 if (alen < offsetofend(struct sockaddr, sa_family))
1121 goto out;
1122
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123 if (addr->sa_family != AF_UNSPEC) {
1124 err = unix_mkname(sunaddr, alen, &hash);
1125 if (err < 0)
1126 goto out;
1127 alen = err;
1128
1129 if (test_bit(SOCK_PASSCRED, &sock->flags) &&
1130 !unix_sk(sk)->addr && (err = unix_autobind(sock)) != 0)
1131 goto out;
1132
David S. Miller278a3de2007-05-31 15:19:20 -07001133restart:
Jianjun Konge27dfce2008-11-01 21:38:31 -07001134 other = unix_find_other(net, sunaddr, alen, sock->type, hash, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135 if (!other)
1136 goto out;
1137
David S. Miller278a3de2007-05-31 15:19:20 -07001138 unix_state_double_lock(sk, other);
1139
1140 /* Apparently VFS overslept socket death. Retry. */
1141 if (sock_flag(other, SOCK_DEAD)) {
1142 unix_state_double_unlock(sk, other);
1143 sock_put(other);
1144 goto restart;
1145 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146
1147 err = -EPERM;
1148 if (!unix_may_send(sk, other))
1149 goto out_unlock;
1150
1151 err = security_unix_may_send(sk->sk_socket, other->sk_socket);
1152 if (err)
1153 goto out_unlock;
1154
1155 } else {
1156 /*
1157 * 1003.1g breaking connected state with AF_UNSPEC
1158 */
1159 other = NULL;
David S. Miller278a3de2007-05-31 15:19:20 -07001160 unix_state_double_lock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161 }
1162
1163 /*
1164 * If it was connected, reconnect.
1165 */
1166 if (unix_peer(sk)) {
1167 struct sock *old_peer = unix_peer(sk);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001168 unix_peer(sk) = other;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001169 unix_dgram_peer_wake_disconnect_wakeup(sk, old_peer);
1170
David S. Miller278a3de2007-05-31 15:19:20 -07001171 unix_state_double_unlock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172
1173 if (other != old_peer)
1174 unix_dgram_disconnected(sk, old_peer);
1175 sock_put(old_peer);
1176 } else {
Jianjun Konge27dfce2008-11-01 21:38:31 -07001177 unix_peer(sk) = other;
David S. Miller278a3de2007-05-31 15:19:20 -07001178 unix_state_double_unlock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179 }
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001180 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181
1182out_unlock:
David S. Miller278a3de2007-05-31 15:19:20 -07001183 unix_state_double_unlock(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184 sock_put(other);
1185out:
1186 return err;
1187}
1188
1189static long unix_wait_for_peer(struct sock *other, long timeo)
1190{
1191 struct unix_sock *u = unix_sk(other);
1192 int sched;
1193 DEFINE_WAIT(wait);
1194
1195 prepare_to_wait_exclusive(&u->peer_wait, &wait, TASK_INTERRUPTIBLE);
1196
1197 sched = !sock_flag(other, SOCK_DEAD) &&
1198 !(other->sk_shutdown & RCV_SHUTDOWN) &&
Rainer Weikusat3c734192008-06-17 22:28:05 -07001199 unix_recvq_full(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200
David S. Miller1c92b4e2007-05-31 13:24:26 -07001201 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202
1203 if (sched)
1204 timeo = schedule_timeout(timeo);
1205
1206 finish_wait(&u->peer_wait, &wait);
1207 return timeo;
1208}
1209
1210static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
1211 int addr_len, int flags)
1212{
Jianjun Konge27dfce2008-11-01 21:38:31 -07001213 struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001214 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001215 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001216 struct unix_sock *u = unix_sk(sk), *newu, *otheru;
1217 struct sock *newsk = NULL;
1218 struct sock *other = NULL;
1219 struct sk_buff *skb = NULL;
Eric Dumazet95c96172012-04-15 05:58:06 +00001220 unsigned int hash;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 int st;
1222 int err;
1223 long timeo;
1224
1225 err = unix_mkname(sunaddr, addr_len, &hash);
1226 if (err < 0)
1227 goto out;
1228 addr_len = err;
1229
Joe Perchesf64f9e72009-11-29 16:55:45 -08001230 if (test_bit(SOCK_PASSCRED, &sock->flags) && !u->addr &&
1231 (err = unix_autobind(sock)) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232 goto out;
1233
1234 timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
1235
1236 /* First of all allocate resources.
1237 If we will make it after state is locked,
1238 we will have to recheck all again in any case.
1239 */
1240
1241 err = -ENOMEM;
1242
1243 /* create new sock for complete connection */
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001244 newsk = unix_create1(sock_net(sk), NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001245 if (newsk == NULL)
1246 goto out;
1247
1248 /* Allocate skb for sending to listening sock */
1249 skb = sock_wmalloc(newsk, 1, 0, GFP_KERNEL);
1250 if (skb == NULL)
1251 goto out;
1252
1253restart:
1254 /* Find listening sock. */
Denis V. Lunev097e66c2007-11-19 22:29:30 -08001255 other = unix_find_other(net, sunaddr, addr_len, sk->sk_type, hash, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256 if (!other)
1257 goto out;
1258
1259 /* Latch state of peer */
David S. Miller1c92b4e2007-05-31 13:24:26 -07001260 unix_state_lock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261
1262 /* Apparently VFS overslept socket death. Retry. */
1263 if (sock_flag(other, SOCK_DEAD)) {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001264 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265 sock_put(other);
1266 goto restart;
1267 }
1268
1269 err = -ECONNREFUSED;
1270 if (other->sk_state != TCP_LISTEN)
1271 goto out_unlock;
Tomoki Sekiyama77238f22009-10-18 23:17:37 -07001272 if (other->sk_shutdown & RCV_SHUTDOWN)
1273 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274
Rainer Weikusat3c734192008-06-17 22:28:05 -07001275 if (unix_recvq_full(other)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276 err = -EAGAIN;
1277 if (!timeo)
1278 goto out_unlock;
1279
1280 timeo = unix_wait_for_peer(other, timeo);
1281
1282 err = sock_intr_errno(timeo);
1283 if (signal_pending(current))
1284 goto out;
1285 sock_put(other);
1286 goto restart;
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001287 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288
1289 /* Latch our state.
1290
Daniel Balutae5537bf2011-03-14 15:25:33 -07001291 It is tricky place. We need to grab our state lock and cannot
Linus Torvalds1da177e2005-04-16 15:20:36 -07001292 drop lock on peer. It is dangerous because deadlock is
1293 possible. Connect to self case and simultaneous
1294 attempt to connect are eliminated by checking socket
1295 state. other is TCP_LISTEN, if sk is TCP_LISTEN we
1296 check this before attempt to grab lock.
1297
1298 Well, and we have to recheck the state after socket locked.
1299 */
1300 st = sk->sk_state;
1301
1302 switch (st) {
1303 case TCP_CLOSE:
1304 /* This is ok... continue with connect */
1305 break;
1306 case TCP_ESTABLISHED:
1307 /* Socket is already connected */
1308 err = -EISCONN;
1309 goto out_unlock;
1310 default:
1311 err = -EINVAL;
1312 goto out_unlock;
1313 }
1314
David S. Miller1c92b4e2007-05-31 13:24:26 -07001315 unix_state_lock_nested(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001316
1317 if (sk->sk_state != st) {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001318 unix_state_unlock(sk);
1319 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001320 sock_put(other);
1321 goto restart;
1322 }
1323
David S. Miller3610cda2011-01-05 15:38:53 -08001324 err = security_unix_stream_connect(sk, other, newsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001325 if (err) {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001326 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327 goto out_unlock;
1328 }
1329
1330 /* The way is open! Fastly set all the necessary fields... */
1331
1332 sock_hold(sk);
1333 unix_peer(newsk) = sk;
1334 newsk->sk_state = TCP_ESTABLISHED;
1335 newsk->sk_type = sk->sk_type;
Eric W. Biederman109f6e32010-06-13 03:30:14 +00001336 init_peercred(newsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337 newu = unix_sk(newsk);
Eric Dumazeteaefd1102011-02-18 03:26:36 +00001338 RCU_INIT_POINTER(newsk->sk_wq, &newu->peer_wq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339 otheru = unix_sk(other);
1340
Al Viroae3b5642019-02-15 20:09:35 +00001341 /* copy address information from listening to new sock
1342 *
1343 * The contents of *(otheru->addr) and otheru->path
1344 * are seen fully set up here, since we have found
1345 * otheru in hash under unix_table_lock. Insertion
1346 * into the hash chain we'd found it in had been done
1347 * in an earlier critical area protected by unix_table_lock,
1348 * the same one where we'd set *(otheru->addr) contents,
1349 * as well as otheru->path and otheru->addr itself.
1350 *
1351 * Using smp_store_release() here to set newu->addr
1352 * is enough to make those stores, as well as stores
1353 * to newu->path visible to anyone who gets newu->addr
1354 * by smp_load_acquire(). IOW, the same warranties
1355 * as for unix_sock instances bound in unix_bind() or
1356 * in unix_autobind().
1357 */
Al Viro40ffe672012-03-14 21:54:32 -04001358 if (otheru->path.dentry) {
1359 path_get(&otheru->path);
1360 newu->path = otheru->path;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361 }
Al Viroae3b5642019-02-15 20:09:35 +00001362 refcount_inc(&otheru->addr->refcnt);
1363 smp_store_release(&newu->addr, otheru->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364
1365 /* Set credentials */
Eric W. Biederman109f6e32010-06-13 03:30:14 +00001366 copy_peercred(sk, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001367
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368 sock->state = SS_CONNECTED;
1369 sk->sk_state = TCP_ESTABLISHED;
Benjamin LaHaise830a1e52005-12-13 23:22:32 -08001370 sock_hold(newsk);
1371
Peter Zijlstra4e857c52014-03-17 18:06:10 +01001372 smp_mb__after_atomic(); /* sock_hold() does an atomic_inc() */
Benjamin LaHaise830a1e52005-12-13 23:22:32 -08001373 unix_peer(sk) = newsk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374
David S. Miller1c92b4e2007-05-31 13:24:26 -07001375 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376
1377 /* take ten and and send info to listening sock */
1378 spin_lock(&other->sk_receive_queue.lock);
1379 __skb_queue_tail(&other->sk_receive_queue, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380 spin_unlock(&other->sk_receive_queue.lock);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001381 unix_state_unlock(other);
David S. Miller676d2362014-04-11 16:15:36 -04001382 other->sk_data_ready(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383 sock_put(other);
1384 return 0;
1385
1386out_unlock:
1387 if (other)
David S. Miller1c92b4e2007-05-31 13:24:26 -07001388 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389
1390out:
Wei Yongjun40d44442009-02-25 00:32:45 +00001391 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392 if (newsk)
1393 unix_release_sock(newsk, 0);
1394 if (other)
1395 sock_put(other);
1396 return err;
1397}
1398
1399static int unix_socketpair(struct socket *socka, struct socket *sockb)
1400{
Jianjun Konge27dfce2008-11-01 21:38:31 -07001401 struct sock *ska = socka->sk, *skb = sockb->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001402
1403 /* Join our sockets back to back */
1404 sock_hold(ska);
1405 sock_hold(skb);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001406 unix_peer(ska) = skb;
1407 unix_peer(skb) = ska;
Eric W. Biederman109f6e32010-06-13 03:30:14 +00001408 init_peercred(ska);
1409 init_peercred(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410
1411 if (ska->sk_type != SOCK_DGRAM) {
1412 ska->sk_state = TCP_ESTABLISHED;
1413 skb->sk_state = TCP_ESTABLISHED;
1414 socka->state = SS_CONNECTED;
1415 sockb->state = SS_CONNECTED;
1416 }
1417 return 0;
1418}
1419
Daniel Borkmann90c6bd32013-10-17 22:51:31 +02001420static void unix_sock_inherit_flags(const struct socket *old,
1421 struct socket *new)
1422{
1423 if (test_bit(SOCK_PASSCRED, &old->flags))
1424 set_bit(SOCK_PASSCRED, &new->flags);
1425 if (test_bit(SOCK_PASSSEC, &old->flags))
1426 set_bit(SOCK_PASSSEC, &new->flags);
1427}
1428
David Howellscdfbabf2017-03-09 08:09:05 +00001429static int unix_accept(struct socket *sock, struct socket *newsock, int flags,
1430 bool kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431{
1432 struct sock *sk = sock->sk;
1433 struct sock *tsk;
1434 struct sk_buff *skb;
1435 int err;
1436
1437 err = -EOPNOTSUPP;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001438 if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439 goto out;
1440
1441 err = -EINVAL;
1442 if (sk->sk_state != TCP_LISTEN)
1443 goto out;
1444
1445 /* If socket state is TCP_LISTEN it cannot change (for now...),
1446 * so that no locks are necessary.
1447 */
1448
1449 skb = skb_recv_datagram(sk, 0, flags&O_NONBLOCK, &err);
1450 if (!skb) {
1451 /* This means receive shutdown. */
1452 if (err == 0)
1453 err = -EINVAL;
1454 goto out;
1455 }
1456
1457 tsk = skb->sk;
1458 skb_free_datagram(sk, skb);
1459 wake_up_interruptible(&unix_sk(sk)->peer_wait);
1460
1461 /* attach accepted sock to socket */
David S. Miller1c92b4e2007-05-31 13:24:26 -07001462 unix_state_lock(tsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001463 newsock->state = SS_CONNECTED;
Daniel Borkmann90c6bd32013-10-17 22:51:31 +02001464 unix_sock_inherit_flags(sock, newsock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 sock_graft(tsk, newsock);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001466 unix_state_unlock(tsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467 return 0;
1468
1469out:
1470 return err;
1471}
1472
1473
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +01001474static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int peer)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475{
1476 struct sock *sk = sock->sk;
Al Viroae3b5642019-02-15 20:09:35 +00001477 struct unix_address *addr;
Cyrill Gorcunov13cfa972009-11-08 05:51:19 +00001478 DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, uaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 int err = 0;
1480
1481 if (peer) {
1482 sk = unix_peer_get(sk);
1483
1484 err = -ENOTCONN;
1485 if (!sk)
1486 goto out;
1487 err = 0;
1488 } else {
1489 sock_hold(sk);
1490 }
1491
Al Viroae3b5642019-02-15 20:09:35 +00001492 addr = smp_load_acquire(&unix_sk(sk)->addr);
1493 if (!addr) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494 sunaddr->sun_family = AF_UNIX;
1495 sunaddr->sun_path[0] = 0;
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +01001496 err = sizeof(short);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 } else {
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +01001498 err = addr->len;
1499 memcpy(sunaddr, addr->name, addr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001500 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501 sock_put(sk);
1502out:
1503 return err;
1504}
1505
David S. Millerf78a5fd2011-09-16 19:34:00 -04001506static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds)
Eric W. Biederman7361c362010-06-13 03:34:33 +00001507{
1508 int err = 0;
Eric Dumazet16e57262011-09-19 05:52:27 +00001509
David S. Millerf78a5fd2011-09-16 19:34:00 -04001510 UNIXCB(skb).pid = get_pid(scm->pid);
Eric W. Biederman6b0ee8c02013-04-03 17:28:16 +00001511 UNIXCB(skb).uid = scm->creds.uid;
1512 UNIXCB(skb).gid = scm->creds.gid;
Eric W. Biederman7361c362010-06-13 03:34:33 +00001513 UNIXCB(skb).fp = NULL;
Stephen Smalley37a9a8d2015-06-10 08:44:59 -04001514 unix_get_secdata(scm, skb);
Eric W. Biederman7361c362010-06-13 03:34:33 +00001515 if (scm->fp && send_fds)
1516 err = unix_attach_fds(scm, skb);
1517
1518 skb->destructor = unix_destruct_scm;
1519 return err;
1520}
1521
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001522static bool unix_passcred_enabled(const struct socket *sock,
1523 const struct sock *other)
1524{
1525 return test_bit(SOCK_PASSCRED, &sock->flags) ||
1526 !other->sk_socket ||
1527 test_bit(SOCK_PASSCRED, &other->sk_socket->flags);
1528}
1529
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530/*
Eric Dumazet16e57262011-09-19 05:52:27 +00001531 * Some apps rely on write() giving SCM_CREDENTIALS
1532 * We include credentials if source or destination socket
1533 * asserted SOCK_PASSCRED.
1534 */
1535static void maybe_add_creds(struct sk_buff *skb, const struct socket *sock,
1536 const struct sock *other)
1537{
Eric W. Biederman6b0ee8c02013-04-03 17:28:16 +00001538 if (UNIXCB(skb).pid)
Eric Dumazet16e57262011-09-19 05:52:27 +00001539 return;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001540 if (unix_passcred_enabled(sock, other)) {
Eric Dumazet16e57262011-09-19 05:52:27 +00001541 UNIXCB(skb).pid = get_pid(task_tgid(current));
David S. Miller6e0895c2013-04-22 20:32:51 -04001542 current_uid_gid(&UNIXCB(skb).uid, &UNIXCB(skb).gid);
Eric Dumazet16e57262011-09-19 05:52:27 +00001543 }
1544}
1545
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001546static int maybe_init_creds(struct scm_cookie *scm,
1547 struct socket *socket,
1548 const struct sock *other)
1549{
1550 int err;
1551 struct msghdr msg = { .msg_controllen = 0 };
1552
1553 err = scm_send(socket, &msg, scm, false);
1554 if (err)
1555 return err;
1556
1557 if (unix_passcred_enabled(socket, other)) {
1558 scm->pid = get_pid(task_tgid(current));
1559 current_uid_gid(&scm->creds.uid, &scm->creds.gid);
1560 }
1561 return err;
1562}
1563
1564static bool unix_skb_scm_eq(struct sk_buff *skb,
1565 struct scm_cookie *scm)
1566{
1567 const struct unix_skb_parms *u = &UNIXCB(skb);
1568
1569 return u->pid == scm->pid &&
1570 uid_eq(u->uid, scm->creds.uid) &&
1571 gid_eq(u->gid, scm->creds.gid) &&
1572 unix_secdata_eq(scm, skb);
1573}
1574
Eric Dumazet16e57262011-09-19 05:52:27 +00001575/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 * Send AF_UNIX data.
1577 */
1578
Ying Xue1b784142015-03-02 15:37:48 +08001579static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
1580 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582 struct sock *sk = sock->sk;
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001583 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584 struct unix_sock *u = unix_sk(sk);
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001585 DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586 struct sock *other = NULL;
1587 int namelen = 0; /* fake GCC */
1588 int err;
Eric Dumazet95c96172012-04-15 05:58:06 +00001589 unsigned int hash;
David S. Millerf78a5fd2011-09-16 19:34:00 -04001590 struct sk_buff *skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591 long timeo;
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001592 struct scm_cookie scm;
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001593 int data_len = 0;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001594 int sk_locked;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001595
dann frazier5f23b732008-11-26 15:32:27 -08001596 wait_for_unix_gc();
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001597 err = scm_send(sock, msg, &scm, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001598 if (err < 0)
1599 return err;
1600
1601 err = -EOPNOTSUPP;
1602 if (msg->msg_flags&MSG_OOB)
1603 goto out;
1604
1605 if (msg->msg_namelen) {
1606 err = unix_mkname(sunaddr, msg->msg_namelen, &hash);
1607 if (err < 0)
1608 goto out;
1609 namelen = err;
1610 } else {
1611 sunaddr = NULL;
1612 err = -ENOTCONN;
1613 other = unix_peer_get(sk);
1614 if (!other)
1615 goto out;
1616 }
1617
Joe Perchesf64f9e72009-11-29 16:55:45 -08001618 if (test_bit(SOCK_PASSCRED, &sock->flags) && !u->addr
1619 && (err = unix_autobind(sock)) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620 goto out;
1621
1622 err = -EMSGSIZE;
1623 if (len > sk->sk_sndbuf - 32)
1624 goto out;
1625
Kirill Tkhai31ff6aa2014-05-15 19:56:28 +04001626 if (len > SKB_MAX_ALLOC) {
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001627 data_len = min_t(size_t,
1628 len - SKB_MAX_ALLOC,
1629 MAX_SKB_FRAGS * PAGE_SIZE);
Kirill Tkhai31ff6aa2014-05-15 19:56:28 +04001630 data_len = PAGE_ALIGN(data_len);
1631
1632 BUILD_BUG_ON(SKB_MAX_ALLOC < PAGE_SIZE);
1633 }
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001634
1635 skb = sock_alloc_send_pskb(sk, len - data_len, data_len,
Eric Dumazet28d64272013-08-08 14:38:47 -07001636 msg->msg_flags & MSG_DONTWAIT, &err,
1637 PAGE_ALLOC_COSTLY_ORDER);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001638 if (skb == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001639 goto out;
1640
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001641 err = unix_scm_to_skb(&scm, skb, true);
Eric Dumazet25888e32010-11-25 04:11:39 +00001642 if (err < 0)
Eric W. Biederman7361c362010-06-13 03:34:33 +00001643 goto out_free;
Catherine Zhang877ce7c2006-06-29 12:27:47 -07001644
Eric Dumazeteb6a2482012-04-03 05:28:28 +00001645 skb_put(skb, len - data_len);
1646 skb->data_len = data_len;
1647 skb->len = len;
Al Viroc0371da2014-11-24 10:42:55 -05001648 err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649 if (err)
1650 goto out_free;
1651
1652 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1653
1654restart:
1655 if (!other) {
1656 err = -ECONNRESET;
1657 if (sunaddr == NULL)
1658 goto out_free;
1659
Denis V. Lunev097e66c2007-11-19 22:29:30 -08001660 other = unix_find_other(net, sunaddr, namelen, sk->sk_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001661 hash, &err);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001662 if (other == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663 goto out_free;
1664 }
1665
Alban Crequyd6ae3ba2011-01-18 06:39:15 +00001666 if (sk_filter(other, skb) < 0) {
1667 /* Toss the packet but do not return any error to the sender */
1668 err = len;
1669 goto out_free;
1670 }
1671
Rainer Weikusat7d267272015-11-20 22:07:23 +00001672 sk_locked = 0;
David S. Miller1c92b4e2007-05-31 13:24:26 -07001673 unix_state_lock(other);
Rainer Weikusat7d267272015-11-20 22:07:23 +00001674restart_locked:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001675 err = -EPERM;
1676 if (!unix_may_send(sk, other))
1677 goto out_unlock;
1678
Rainer Weikusat7d267272015-11-20 22:07:23 +00001679 if (unlikely(sock_flag(other, SOCK_DEAD))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680 /*
1681 * Check with 1003.1g - what should
1682 * datagram error
1683 */
David S. Miller1c92b4e2007-05-31 13:24:26 -07001684 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001685 sock_put(other);
1686
Rainer Weikusat7d267272015-11-20 22:07:23 +00001687 if (!sk_locked)
1688 unix_state_lock(sk);
1689
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 if (unix_peer(sk) == other) {
Jianjun Konge27dfce2008-11-01 21:38:31 -07001692 unix_peer(sk) = NULL;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001693 unix_dgram_peer_wake_disconnect_wakeup(sk, other);
1694
David S. Miller1c92b4e2007-05-31 13:24:26 -07001695 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001696
1697 unix_dgram_disconnected(sk, other);
1698 sock_put(other);
1699 err = -ECONNREFUSED;
1700 } else {
David S. Miller1c92b4e2007-05-31 13:24:26 -07001701 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001702 }
1703
1704 other = NULL;
1705 if (err)
1706 goto out_free;
1707 goto restart;
1708 }
1709
1710 err = -EPIPE;
1711 if (other->sk_shutdown & RCV_SHUTDOWN)
1712 goto out_unlock;
1713
1714 if (sk->sk_type != SOCK_SEQPACKET) {
1715 err = security_unix_may_send(sk->sk_socket, other->sk_socket);
1716 if (err)
1717 goto out_unlock;
1718 }
1719
Rainer Weikusata5527dd2016-02-11 19:37:27 +00001720 /* other == sk && unix_peer(other) != sk if
1721 * - unix_peer(sk) == NULL, destination address bound to sk
1722 * - unix_peer(sk) == sk by time of get but disconnected before lock
1723 */
1724 if (other != sk &&
1725 unlikely(unix_peer(other) != sk && unix_recvq_full(other))) {
Rainer Weikusat7d267272015-11-20 22:07:23 +00001726 if (timeo) {
1727 timeo = unix_wait_for_peer(other, timeo);
1728
1729 err = sock_intr_errno(timeo);
1730 if (signal_pending(current))
1731 goto out_free;
1732
1733 goto restart;
1734 }
1735
1736 if (!sk_locked) {
1737 unix_state_unlock(other);
1738 unix_state_double_lock(sk, other);
1739 }
1740
1741 if (unix_peer(sk) != other ||
1742 unix_dgram_peer_wake_me(sk, other)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743 err = -EAGAIN;
Rainer Weikusat7d267272015-11-20 22:07:23 +00001744 sk_locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 goto out_unlock;
1746 }
1747
Rainer Weikusat7d267272015-11-20 22:07:23 +00001748 if (!sk_locked) {
1749 sk_locked = 1;
1750 goto restart_locked;
1751 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752 }
1753
Rainer Weikusat7d267272015-11-20 22:07:23 +00001754 if (unlikely(sk_locked))
1755 unix_state_unlock(sk);
1756
Alban Crequy3f661162010-10-04 08:48:28 +00001757 if (sock_flag(other, SOCK_RCVTSTAMP))
1758 __net_timestamp(skb);
Eric Dumazet16e57262011-09-19 05:52:27 +00001759 maybe_add_creds(skb, sock, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001760 skb_queue_tail(&other->sk_receive_queue, skb);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001761 unix_state_unlock(other);
David S. Miller676d2362014-04-11 16:15:36 -04001762 other->sk_data_ready(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763 sock_put(other);
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001764 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765 return len;
1766
1767out_unlock:
Rainer Weikusat7d267272015-11-20 22:07:23 +00001768 if (sk_locked)
1769 unix_state_unlock(sk);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001770 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001771out_free:
1772 kfree_skb(skb);
1773out:
1774 if (other)
1775 sock_put(other);
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001776 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001777 return err;
1778}
1779
Eric Dumazete370a722013-08-08 14:37:32 -07001780/* We use paged skbs for stream sockets, and limit occupancy to 32768
Tobias Klauserd4e9a402018-02-13 11:11:30 +01001781 * bytes, and a minimum of a full page.
Eric Dumazete370a722013-08-08 14:37:32 -07001782 */
1783#define UNIX_SKB_FRAGS_SZ (PAGE_SIZE << get_order(32768))
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001784
Ying Xue1b784142015-03-02 15:37:48 +08001785static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
1786 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001787{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001788 struct sock *sk = sock->sk;
1789 struct sock *other = NULL;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001790 int err, size;
David S. Millerf78a5fd2011-09-16 19:34:00 -04001791 struct sk_buff *skb;
Jianjun Konge27dfce2008-11-01 21:38:31 -07001792 int sent = 0;
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001793 struct scm_cookie scm;
Miklos Szeredi8ba69ba2009-09-11 11:31:45 -07001794 bool fds_sent = false;
Eric Dumazete370a722013-08-08 14:37:32 -07001795 int data_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001796
dann frazier5f23b732008-11-26 15:32:27 -08001797 wait_for_unix_gc();
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001798 err = scm_send(sock, msg, &scm, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799 if (err < 0)
1800 return err;
1801
1802 err = -EOPNOTSUPP;
1803 if (msg->msg_flags&MSG_OOB)
1804 goto out_err;
1805
1806 if (msg->msg_namelen) {
1807 err = sk->sk_state == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP;
1808 goto out_err;
1809 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810 err = -ENOTCONN;
Benjamin LaHaise830a1e52005-12-13 23:22:32 -08001811 other = unix_peer(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812 if (!other)
1813 goto out_err;
1814 }
1815
1816 if (sk->sk_shutdown & SEND_SHUTDOWN)
1817 goto pipe_err;
1818
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001819 while (sent < len) {
Eric Dumazete370a722013-08-08 14:37:32 -07001820 size = len - sent;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001821
1822 /* Keep two messages in the pipe so it schedules better */
Eric Dumazete370a722013-08-08 14:37:32 -07001823 size = min_t(int, size, (sk->sk_sndbuf >> 1) - 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001824
Eric Dumazete370a722013-08-08 14:37:32 -07001825 /* allow fallback to order-0 allocations */
1826 size = min_t(int, size, SKB_MAX_HEAD(0) + UNIX_SKB_FRAGS_SZ);
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001827
Eric Dumazete370a722013-08-08 14:37:32 -07001828 data_len = max_t(int, 0, size - SKB_MAX_HEAD(0));
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09001829
Kirill Tkhai31ff6aa2014-05-15 19:56:28 +04001830 data_len = min_t(size_t, size, PAGE_ALIGN(data_len));
1831
Eric Dumazete370a722013-08-08 14:37:32 -07001832 skb = sock_alloc_send_pskb(sk, size - data_len, data_len,
Eric Dumazet28d64272013-08-08 14:38:47 -07001833 msg->msg_flags & MSG_DONTWAIT, &err,
1834 get_order(UNIX_SKB_FRAGS_SZ));
Eric Dumazete370a722013-08-08 14:37:32 -07001835 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836 goto out_err;
1837
David S. Millerf78a5fd2011-09-16 19:34:00 -04001838 /* Only send the fds in the first buffer */
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001839 err = unix_scm_to_skb(&scm, skb, !fds_sent);
Eric Dumazet25888e32010-11-25 04:11:39 +00001840 if (err < 0) {
Eric W. Biederman7361c362010-06-13 03:34:33 +00001841 kfree_skb(skb);
David S. Millerf78a5fd2011-09-16 19:34:00 -04001842 goto out_err;
Miklos Szeredi62093442008-11-09 15:23:57 +01001843 }
Eric W. Biederman7361c362010-06-13 03:34:33 +00001844 fds_sent = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001845
Eric Dumazete370a722013-08-08 14:37:32 -07001846 skb_put(skb, size - data_len);
1847 skb->data_len = data_len;
1848 skb->len = size;
Al Viroc0371da2014-11-24 10:42:55 -05001849 err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, size);
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001850 if (err) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001851 kfree_skb(skb);
David S. Millerf78a5fd2011-09-16 19:34:00 -04001852 goto out_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001853 }
1854
David S. Miller1c92b4e2007-05-31 13:24:26 -07001855 unix_state_lock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001856
1857 if (sock_flag(other, SOCK_DEAD) ||
1858 (other->sk_shutdown & RCV_SHUTDOWN))
1859 goto pipe_err_free;
1860
Eric Dumazet16e57262011-09-19 05:52:27 +00001861 maybe_add_creds(skb, sock, other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001862 skb_queue_tail(&other->sk_receive_queue, skb);
David S. Miller1c92b4e2007-05-31 13:24:26 -07001863 unix_state_unlock(other);
David S. Miller676d2362014-04-11 16:15:36 -04001864 other->sk_data_ready(other);
Jianjun Konge27dfce2008-11-01 21:38:31 -07001865 sent += size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001866 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001867
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001868 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001869
1870 return sent;
1871
1872pipe_err_free:
David S. Miller1c92b4e2007-05-31 13:24:26 -07001873 unix_state_unlock(other);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001874 kfree_skb(skb);
1875pipe_err:
Eric Dumazet6eba6a32008-11-16 22:58:44 -08001876 if (sent == 0 && !(msg->msg_flags&MSG_NOSIGNAL))
1877 send_sig(SIGPIPE, current, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878 err = -EPIPE;
1879out_err:
Christoph Hellwig7cc05662015-01-28 18:04:53 +01001880 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001881 return sent ? : err;
1882}
1883
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001884static ssize_t unix_stream_sendpage(struct socket *socket, struct page *page,
1885 int offset, size_t size, int flags)
1886{
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001887 int err;
1888 bool send_sigpipe = false;
1889 bool init_scm = true;
1890 struct scm_cookie scm;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001891 struct sock *other, *sk = socket->sk;
1892 struct sk_buff *skb, *newskb = NULL, *tail = NULL;
1893
1894 if (flags & MSG_OOB)
1895 return -EOPNOTSUPP;
1896
1897 other = unix_peer(sk);
1898 if (!other || sk->sk_state != TCP_ESTABLISHED)
1899 return -ENOTCONN;
1900
1901 if (false) {
1902alloc_skb:
1903 unix_state_unlock(other);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001904 mutex_unlock(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001905 newskb = sock_alloc_send_pskb(sk, 0, 0, flags & MSG_DONTWAIT,
1906 &err, 0);
1907 if (!newskb)
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001908 goto err;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001909 }
1910
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001911 /* we must acquire iolock as we modify already present
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001912 * skbs in the sk_receive_queue and mess with skb->len
1913 */
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001914 err = mutex_lock_interruptible(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001915 if (err) {
1916 err = flags & MSG_DONTWAIT ? -EAGAIN : -ERESTARTSYS;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001917 goto err;
1918 }
1919
1920 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1921 err = -EPIPE;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001922 send_sigpipe = true;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001923 goto err_unlock;
1924 }
1925
1926 unix_state_lock(other);
1927
1928 if (sock_flag(other, SOCK_DEAD) ||
1929 other->sk_shutdown & RCV_SHUTDOWN) {
1930 err = -EPIPE;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001931 send_sigpipe = true;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001932 goto err_state_unlock;
1933 }
1934
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001935 if (init_scm) {
1936 err = maybe_init_creds(&scm, socket, other);
1937 if (err)
1938 goto err_state_unlock;
1939 init_scm = false;
1940 }
1941
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001942 skb = skb_peek_tail(&other->sk_receive_queue);
1943 if (tail && tail == skb) {
1944 skb = newskb;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001945 } else if (!skb || !unix_skb_scm_eq(skb, &scm)) {
1946 if (newskb) {
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001947 skb = newskb;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001948 } else {
1949 tail = skb;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001950 goto alloc_skb;
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001951 }
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001952 } else if (newskb) {
1953 /* this is fast path, we don't necessarily need to
1954 * call to kfree_skb even though with newskb == NULL
1955 * this - does no harm
1956 */
1957 consume_skb(newskb);
Hannes Frederic Sowa8844f972015-11-16 16:25:56 +01001958 newskb = NULL;
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001959 }
1960
1961 if (skb_append_pagefrags(skb, page, offset, size)) {
1962 tail = skb;
1963 goto alloc_skb;
1964 }
1965
1966 skb->len += size;
1967 skb->data_len += size;
1968 skb->truesize += size;
Reshetova, Elena14afee42017-06-30 13:08:00 +03001969 refcount_add(size, &sk->sk_wmem_alloc);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001970
Hannes Frederic Sowaa3a116e2015-11-17 15:10:59 +01001971 if (newskb) {
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001972 err = unix_scm_to_skb(&scm, skb, false);
1973 if (err)
1974 goto err_state_unlock;
Hannes Frederic Sowaa3a116e2015-11-17 15:10:59 +01001975 spin_lock(&other->sk_receive_queue.lock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001976 __skb_queue_tail(&other->sk_receive_queue, newskb);
Hannes Frederic Sowaa3a116e2015-11-17 15:10:59 +01001977 spin_unlock(&other->sk_receive_queue.lock);
1978 }
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001979
1980 unix_state_unlock(other);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001981 mutex_unlock(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001982
1983 other->sk_data_ready(other);
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001984 scm_destroy(&scm);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001985 return size;
1986
1987err_state_unlock:
1988 unix_state_unlock(other);
1989err_unlock:
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07001990 mutex_unlock(&unix_sk(other)->iolock);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001991err:
1992 kfree_skb(newskb);
1993 if (send_sigpipe && !(flags & MSG_NOSIGNAL))
1994 send_sig(SIGPIPE, current, 0);
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01001995 if (!init_scm)
1996 scm_destroy(&scm);
Hannes Frederic Sowa869e7c62015-05-21 16:59:59 +02001997 return err;
1998}
1999
Ying Xue1b784142015-03-02 15:37:48 +08002000static int unix_seqpacket_sendmsg(struct socket *sock, struct msghdr *msg,
2001 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002002{
2003 int err;
2004 struct sock *sk = sock->sk;
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002005
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006 err = sock_error(sk);
2007 if (err)
2008 return err;
2009
2010 if (sk->sk_state != TCP_ESTABLISHED)
2011 return -ENOTCONN;
2012
2013 if (msg->msg_namelen)
2014 msg->msg_namelen = 0;
2015
Ying Xue1b784142015-03-02 15:37:48 +08002016 return unix_dgram_sendmsg(sock, msg, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002017}
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002018
Ying Xue1b784142015-03-02 15:37:48 +08002019static int unix_seqpacket_recvmsg(struct socket *sock, struct msghdr *msg,
2020 size_t size, int flags)
Eric W. Biedermana05d2ad2011-04-24 01:54:57 +00002021{
2022 struct sock *sk = sock->sk;
2023
2024 if (sk->sk_state != TCP_ESTABLISHED)
2025 return -ENOTCONN;
2026
Ying Xue1b784142015-03-02 15:37:48 +08002027 return unix_dgram_recvmsg(sock, msg, size, flags);
Eric W. Biedermana05d2ad2011-04-24 01:54:57 +00002028}
2029
Linus Torvalds1da177e2005-04-16 15:20:36 -07002030static void unix_copy_addr(struct msghdr *msg, struct sock *sk)
2031{
Al Viroae3b5642019-02-15 20:09:35 +00002032 struct unix_address *addr = smp_load_acquire(&unix_sk(sk)->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002033
Al Viroae3b5642019-02-15 20:09:35 +00002034 if (addr) {
2035 msg->msg_namelen = addr->len;
2036 memcpy(msg->msg_name, addr->name, addr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002037 }
2038}
2039
Ying Xue1b784142015-03-02 15:37:48 +08002040static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
2041 size_t size, int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002042{
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002043 struct scm_cookie scm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002044 struct sock *sk = sock->sk;
2045 struct unix_sock *u = unix_sk(sk);
Rainer Weikusat64874282015-12-06 21:11:38 +00002046 struct sk_buff *skb, *last;
2047 long timeo;
Paolo Abenifd69c392019-04-08 10:15:59 +02002048 int skip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049 int err;
2050
2051 err = -EOPNOTSUPP;
2052 if (flags&MSG_OOB)
2053 goto out;
2054
Rainer Weikusat64874282015-12-06 21:11:38 +00002055 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002056
Rainer Weikusat64874282015-12-06 21:11:38 +00002057 do {
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002058 mutex_lock(&u->iolock);
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002059
Rainer Weikusat64874282015-12-06 21:11:38 +00002060 skip = sk_peek_offset(sk, flags);
Paolo Abenifd69c392019-04-08 10:15:59 +02002061 skb = __skb_try_recv_datagram(sk, flags, NULL, &skip, &err,
2062 &last);
Rainer Weikusat64874282015-12-06 21:11:38 +00002063 if (skb)
2064 break;
2065
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002066 mutex_unlock(&u->iolock);
Rainer Weikusat64874282015-12-06 21:11:38 +00002067
2068 if (err != -EAGAIN)
2069 break;
2070 } while (timeo &&
2071 !__skb_wait_for_more_packets(sk, &err, &timeo, last));
2072
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002073 if (!skb) { /* implies iolock unlocked */
Florian Zumbiehl0a112252007-11-29 23:19:23 +11002074 unix_state_lock(sk);
2075 /* Signal EOF on disconnected non-blocking SEQPACKET socket. */
2076 if (sk->sk_type == SOCK_SEQPACKET && err == -EAGAIN &&
2077 (sk->sk_shutdown & RCV_SHUTDOWN))
2078 err = 0;
2079 unix_state_unlock(sk);
Rainer Weikusat64874282015-12-06 21:11:38 +00002080 goto out;
Florian Zumbiehl0a112252007-11-29 23:19:23 +11002081 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082
Rainer Weikusat77b75f42015-11-26 19:23:15 +00002083 if (wq_has_sleeper(&u->peer_wait))
2084 wake_up_interruptible_sync_poll(&u->peer_wait,
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002085 EPOLLOUT | EPOLLWRNORM |
2086 EPOLLWRBAND);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002087
2088 if (msg->msg_name)
2089 unix_copy_addr(msg, skb->sk);
2090
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002091 if (size > skb->len - skip)
2092 size = skb->len - skip;
2093 else if (size < skb->len - skip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002094 msg->msg_flags |= MSG_TRUNC;
2095
David S. Miller51f3d022014-11-05 16:46:40 -05002096 err = skb_copy_datagram_msg(skb, skip, msg, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002097 if (err)
2098 goto out_free;
2099
Alban Crequy3f661162010-10-04 08:48:28 +00002100 if (sock_flag(sk, SOCK_RCVTSTAMP))
2101 __sock_recv_timestamp(msg, sk, skb);
2102
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002103 memset(&scm, 0, sizeof(scm));
2104
2105 scm_set_cred(&scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid);
2106 unix_set_secdata(&scm, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002108 if (!(flags & MSG_PEEK)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002110 unix_detach_fds(&scm, skb);
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002111
2112 sk_peek_offset_bwd(sk, skb->len);
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002113 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002114 /* It is questionable: on PEEK we could:
2115 - do not return fds - good, but too simple 8)
2116 - return fds, and do not return them on read (old strategy,
2117 apparently wrong)
2118 - clone fds (I chose it for now, it is the most universal
2119 solution)
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002120
2121 POSIX 1003.1g does not actually define this clearly
2122 at all. POSIX 1003.1g doesn't define a lot of things
2123 clearly however!
2124
Linus Torvalds1da177e2005-04-16 15:20:36 -07002125 */
Pavel Emelyanovf55bb7f2012-02-21 07:31:51 +00002126
2127 sk_peek_offset_fwd(sk, size);
2128
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002130 scm.fp = scm_fp_dup(UNIXCB(skb).fp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002131 }
Eric Dumazet9f6f9af2012-02-21 23:24:55 +00002132 err = (flags & MSG_TRUNC) ? skb->len - skip : size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002134 scm_recv(sock, msg, &scm, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002135
2136out_free:
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002137 skb_free_datagram(sk, skb);
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002138 mutex_unlock(&u->iolock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139out:
2140 return err;
2141}
2142
2143/*
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002144 * Sleep until more data has arrived. But check for races..
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145 */
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002146static long unix_stream_data_wait(struct sock *sk, long timeo,
WANG Cong06a77b02016-11-17 15:55:26 -08002147 struct sk_buff *last, unsigned int last_len,
2148 bool freezable)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149{
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002150 struct sk_buff *tail;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 DEFINE_WAIT(wait);
2152
David S. Miller1c92b4e2007-05-31 13:24:26 -07002153 unix_state_lock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002154
2155 for (;;) {
Eric Dumazetaa395142010-04-20 13:03:51 +00002156 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002157
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002158 tail = skb_peek_tail(&sk->sk_receive_queue);
2159 if (tail != last ||
2160 (tail && tail->len != last_len) ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002161 sk->sk_err ||
2162 (sk->sk_shutdown & RCV_SHUTDOWN) ||
2163 signal_pending(current) ||
2164 !timeo)
2165 break;
2166
Eric Dumazet9cd3e072015-11-29 20:03:10 -08002167 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002168 unix_state_unlock(sk);
WANG Cong06a77b02016-11-17 15:55:26 -08002169 if (freezable)
2170 timeo = freezable_schedule_timeout(timeo);
2171 else
2172 timeo = schedule_timeout(timeo);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002173 unix_state_lock(sk);
Mark Salyzynb48732e2015-05-26 08:22:19 -07002174
2175 if (sock_flag(sk, SOCK_DEAD))
2176 break;
2177
Eric Dumazet9cd3e072015-11-29 20:03:10 -08002178 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179 }
2180
Eric Dumazetaa395142010-04-20 13:03:51 +00002181 finish_wait(sk_sleep(sk), &wait);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002182 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002183 return timeo;
2184}
2185
Eric Dumazete370a722013-08-08 14:37:32 -07002186static unsigned int unix_skb_len(const struct sk_buff *skb)
2187{
2188 return skb->len - UNIXCB(skb).consumed;
2189}
2190
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002191struct unix_stream_read_state {
2192 int (*recv_actor)(struct sk_buff *, int, int,
2193 struct unix_stream_read_state *);
2194 struct socket *socket;
2195 struct msghdr *msg;
2196 struct pipe_inode_info *pipe;
2197 size_t size;
2198 int flags;
2199 unsigned int splice_flags;
2200};
2201
WANG Cong06a77b02016-11-17 15:55:26 -08002202static int unix_stream_read_generic(struct unix_stream_read_state *state,
2203 bool freezable)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002204{
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002205 struct scm_cookie scm;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002206 struct socket *sock = state->socket;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002207 struct sock *sk = sock->sk;
2208 struct unix_sock *u = unix_sk(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209 int copied = 0;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002210 int flags = state->flags;
Eric Dumazetde144392014-03-25 18:42:27 -07002211 int noblock = flags & MSG_DONTWAIT;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002212 bool check_creds = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002213 int target;
2214 int err = 0;
2215 long timeo;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002216 int skip;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002217 size_t size = state->size;
2218 unsigned int last_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002219
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002220 if (unlikely(sk->sk_state != TCP_ESTABLISHED)) {
2221 err = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002222 goto out;
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002223 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002224
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002225 if (unlikely(flags & MSG_OOB)) {
2226 err = -EOPNOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002227 goto out;
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002228 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002229
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002230 target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
Eric Dumazetde144392014-03-25 18:42:27 -07002231 timeo = sock_rcvtimeo(sk, noblock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002233 memset(&scm, 0, sizeof(scm));
2234
Linus Torvalds1da177e2005-04-16 15:20:36 -07002235 /* Lock the socket to prevent queue disordering
2236 * while sleeps in memcpy_tomsg
2237 */
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002238 mutex_lock(&u->iolock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239
Matthew Dawsona0917e02017-08-18 15:04:54 -04002240 skip = max(sk_peek_offset(sk, flags), 0);
Andrey Vagine9193d62015-10-02 00:05:36 +03002241
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002242 do {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243 int chunk;
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002244 bool drop_skb;
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002245 struct sk_buff *skb, *last;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002246
Rainer Weikusat18eceb82016-02-18 12:39:46 +00002247redo:
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002248 unix_state_lock(sk);
Mark Salyzynb48732e2015-05-26 08:22:19 -07002249 if (sock_flag(sk, SOCK_DEAD)) {
2250 err = -ECONNRESET;
2251 goto unlock;
2252 }
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002253 last = skb = skb_peek(&sk->sk_receive_queue);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002254 last_len = last ? last->len : 0;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002255again:
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002256 if (skb == NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257 if (copied >= target)
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002258 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259
2260 /*
2261 * POSIX 1003.1g mandates this order.
2262 */
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002263
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002264 err = sock_error(sk);
2265 if (err)
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002266 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002267 if (sk->sk_shutdown & RCV_SHUTDOWN)
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002268 goto unlock;
2269
2270 unix_state_unlock(sk);
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002271 if (!timeo) {
2272 err = -EAGAIN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002273 break;
Rainer Weikusat1b92ee32016-02-08 18:47:19 +00002274 }
2275
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002276 mutex_unlock(&u->iolock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002277
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002278 timeo = unix_stream_data_wait(sk, timeo, last,
WANG Cong06a77b02016-11-17 15:55:26 -08002279 last_len, freezable);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002280
Rainer Weikusat3822b5c2015-12-16 20:09:25 +00002281 if (signal_pending(current)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002282 err = sock_intr_errno(timeo);
Eric Dumazetfa0dc042016-01-24 13:53:50 -08002283 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002284 goto out;
2285 }
Rainer Weikusatb3ca9b02011-02-28 04:50:55 +00002286
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002287 mutex_lock(&u->iolock);
Rainer Weikusat18eceb82016-02-18 12:39:46 +00002288 goto redo;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002289unlock:
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002290 unix_state_unlock(sk);
2291 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002292 }
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002293
Eric Dumazete370a722013-08-08 14:37:32 -07002294 while (skip >= unix_skb_len(skb)) {
2295 skip -= unix_skb_len(skb);
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002296 last = skb;
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002297 last_len = skb->len;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002298 skb = skb_peek_next(skb, &sk->sk_receive_queue);
Benjamin Poirier79f632c2013-04-29 11:42:14 +00002299 if (!skb)
2300 goto again;
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002301 }
2302
Miklos Szeredi3c0d2f32007-06-05 13:10:29 -07002303 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002304
2305 if (check_creds) {
2306 /* Never glue messages from different writers */
Hannes Frederic Sowa9490f882015-11-26 12:08:18 +01002307 if (!unix_skb_scm_eq(skb, &scm))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002308 break;
Eric W. Biederman0e82e7f6d2013-04-03 16:14:47 +00002309 } else if (test_bit(SOCK_PASSCRED, &sock->flags)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310 /* Copy credentials */
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002311 scm_set_cred(&scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid);
Stephen Smalley37a9a8d2015-06-10 08:44:59 -04002312 unix_set_secdata(&scm, skb);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002313 check_creds = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002314 }
2315
2316 /* Copy address just once */
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002317 if (state->msg && state->msg->msg_name) {
2318 DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr,
2319 state->msg->msg_name);
2320 unix_copy_addr(state->msg, skb->sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002321 sunaddr = NULL;
2322 }
2323
Eric Dumazete370a722013-08-08 14:37:32 -07002324 chunk = min_t(unsigned int, unix_skb_len(skb) - skip, size);
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002325 skb_get(skb);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002326 chunk = state->recv_actor(skb, skip, chunk, state);
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002327 drop_skb = !unix_skb_len(skb);
2328 /* skb is only safe to use if !drop_skb */
2329 consume_skb(skb);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002330 if (chunk < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002331 if (copied == 0)
2332 copied = -EFAULT;
2333 break;
2334 }
2335 copied += chunk;
2336 size -= chunk;
2337
Hannes Frederic Sowa73ed5d22015-11-10 16:23:15 +01002338 if (drop_skb) {
2339 /* the skb was touched by a concurrent reader;
2340 * we should not expect anything from this skb
2341 * anymore and assume it invalid - we can be
2342 * sure it was dropped from the socket queue
2343 *
2344 * let's report a short read
2345 */
2346 err = 0;
2347 break;
2348 }
2349
Linus Torvalds1da177e2005-04-16 15:20:36 -07002350 /* Mark read part of skb as used */
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002351 if (!(flags & MSG_PEEK)) {
Eric Dumazete370a722013-08-08 14:37:32 -07002352 UNIXCB(skb).consumed += chunk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002353
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002354 sk_peek_offset_bwd(sk, chunk);
2355
Linus Torvalds1da177e2005-04-16 15:20:36 -07002356 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002357 unix_detach_fds(&scm, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002358
Eric Dumazete370a722013-08-08 14:37:32 -07002359 if (unix_skb_len(skb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002360 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002361
Eric Dumazet6f01fd62012-01-28 16:11:03 +00002362 skb_unlink(skb, &sk->sk_receive_queue);
Neil Horman70d4bf62010-07-20 06:45:56 +00002363 consume_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002364
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002365 if (scm.fp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366 break;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002367 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002368 /* It is questionable, see note in unix_dgram_recvmsg.
2369 */
2370 if (UNIXCB(skb).fp)
Christoph Hellwig7cc05662015-01-28 18:04:53 +01002371 scm.fp = scm_fp_dup(UNIXCB(skb).fp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002372
Andrey Vagine9193d62015-10-02 00:05:36 +03002373 sk_peek_offset_fwd(sk, chunk);
Pavel Emelyanovfc0d7532012-02-21 07:32:06 +00002374
Aaron Conole9f389e32015-09-26 18:50:43 -04002375 if (UNIXCB(skb).fp)
2376 break;
2377
Andrey Vagine9193d62015-10-02 00:05:36 +03002378 skip = 0;
Aaron Conole9f389e32015-09-26 18:50:43 -04002379 last = skb;
2380 last_len = skb->len;
2381 unix_state_lock(sk);
2382 skb = skb_peek_next(skb, &sk->sk_receive_queue);
2383 if (skb)
2384 goto again;
2385 unix_state_unlock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002386 break;
2387 }
2388 } while (size);
2389
Linus Torvalds6e1ce3c2016-09-01 14:43:53 -07002390 mutex_unlock(&u->iolock);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002391 if (state->msg)
2392 scm_recv(sock, state->msg, &scm, flags);
2393 else
2394 scm_destroy(&scm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002395out:
2396 return copied ? : err;
2397}
2398
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002399static int unix_stream_read_actor(struct sk_buff *skb,
2400 int skip, int chunk,
2401 struct unix_stream_read_state *state)
2402{
2403 int ret;
2404
2405 ret = skb_copy_datagram_msg(skb, UNIXCB(skb).consumed + skip,
2406 state->msg, chunk);
2407 return ret ?: chunk;
2408}
2409
2410static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg,
2411 size_t size, int flags)
2412{
2413 struct unix_stream_read_state state = {
2414 .recv_actor = unix_stream_read_actor,
2415 .socket = sock,
2416 .msg = msg,
2417 .size = size,
2418 .flags = flags
2419 };
2420
WANG Cong06a77b02016-11-17 15:55:26 -08002421 return unix_stream_read_generic(&state, true);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002422}
2423
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002424static int unix_stream_splice_actor(struct sk_buff *skb,
2425 int skip, int chunk,
2426 struct unix_stream_read_state *state)
2427{
2428 return skb_splice_bits(skb, state->socket->sk,
2429 UNIXCB(skb).consumed + skip,
Al Viro25869262016-09-17 21:02:10 -04002430 state->pipe, chunk, state->splice_flags);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002431}
2432
2433static ssize_t unix_stream_splice_read(struct socket *sock, loff_t *ppos,
2434 struct pipe_inode_info *pipe,
2435 size_t size, unsigned int flags)
2436{
2437 struct unix_stream_read_state state = {
2438 .recv_actor = unix_stream_splice_actor,
2439 .socket = sock,
2440 .pipe = pipe,
2441 .size = size,
2442 .splice_flags = flags,
2443 };
2444
2445 if (unlikely(*ppos))
2446 return -ESPIPE;
2447
2448 if (sock->file->f_flags & O_NONBLOCK ||
2449 flags & SPLICE_F_NONBLOCK)
2450 state.flags = MSG_DONTWAIT;
2451
WANG Cong06a77b02016-11-17 15:55:26 -08002452 return unix_stream_read_generic(&state, false);
Hannes Frederic Sowa2b514572015-05-21 17:00:01 +02002453}
2454
Linus Torvalds1da177e2005-04-16 15:20:36 -07002455static int unix_shutdown(struct socket *sock, int mode)
2456{
2457 struct sock *sk = sock->sk;
2458 struct sock *other;
2459
Xi Wangfc61b922012-08-26 16:47:13 +00002460 if (mode < SHUT_RD || mode > SHUT_RDWR)
2461 return -EINVAL;
2462 /* This maps:
2463 * SHUT_RD (0) -> RCV_SHUTDOWN (1)
2464 * SHUT_WR (1) -> SEND_SHUTDOWN (2)
2465 * SHUT_RDWR (2) -> SHUTDOWN_MASK (3)
2466 */
2467 ++mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002468
Alban Crequy7180a032011-01-19 04:56:36 +00002469 unix_state_lock(sk);
2470 sk->sk_shutdown |= mode;
2471 other = unix_peer(sk);
2472 if (other)
2473 sock_hold(other);
2474 unix_state_unlock(sk);
2475 sk->sk_state_change(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476
Alban Crequy7180a032011-01-19 04:56:36 +00002477 if (other &&
2478 (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002479
Alban Crequy7180a032011-01-19 04:56:36 +00002480 int peer_mode = 0;
2481
2482 if (mode&RCV_SHUTDOWN)
2483 peer_mode |= SEND_SHUTDOWN;
2484 if (mode&SEND_SHUTDOWN)
2485 peer_mode |= RCV_SHUTDOWN;
2486 unix_state_lock(other);
2487 other->sk_shutdown |= peer_mode;
2488 unix_state_unlock(other);
2489 other->sk_state_change(other);
2490 if (peer_mode == SHUTDOWN_MASK)
2491 sk_wake_async(other, SOCK_WAKE_WAITD, POLL_HUP);
2492 else if (peer_mode & RCV_SHUTDOWN)
2493 sk_wake_async(other, SOCK_WAKE_WAITD, POLL_IN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002494 }
Alban Crequy7180a032011-01-19 04:56:36 +00002495 if (other)
2496 sock_put(other);
2497
Linus Torvalds1da177e2005-04-16 15:20:36 -07002498 return 0;
2499}
2500
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002501long unix_inq_len(struct sock *sk)
2502{
2503 struct sk_buff *skb;
2504 long amount = 0;
2505
2506 if (sk->sk_state == TCP_LISTEN)
2507 return -EINVAL;
2508
2509 spin_lock(&sk->sk_receive_queue.lock);
2510 if (sk->sk_type == SOCK_STREAM ||
2511 sk->sk_type == SOCK_SEQPACKET) {
2512 skb_queue_walk(&sk->sk_receive_queue, skb)
Eric Dumazete370a722013-08-08 14:37:32 -07002513 amount += unix_skb_len(skb);
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002514 } else {
2515 skb = skb_peek(&sk->sk_receive_queue);
2516 if (skb)
2517 amount = skb->len;
2518 }
2519 spin_unlock(&sk->sk_receive_queue.lock);
2520
2521 return amount;
2522}
2523EXPORT_SYMBOL_GPL(unix_inq_len);
2524
2525long unix_outq_len(struct sock *sk)
2526{
2527 return sk_wmem_alloc_get(sk);
2528}
2529EXPORT_SYMBOL_GPL(unix_outq_len);
2530
Andrey Vaginba94f302017-02-01 11:00:45 -08002531static int unix_open_file(struct sock *sk)
2532{
2533 struct path path;
2534 struct file *f;
2535 int fd;
2536
2537 if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))
2538 return -EPERM;
2539
Al Viroae3b5642019-02-15 20:09:35 +00002540 if (!smp_load_acquire(&unix_sk(sk)->addr))
Andrey Vaginba94f302017-02-01 11:00:45 -08002541 return -ENOENT;
Al Viroae3b5642019-02-15 20:09:35 +00002542
2543 path = unix_sk(sk)->path;
2544 if (!path.dentry)
2545 return -ENOENT;
Andrey Vaginba94f302017-02-01 11:00:45 -08002546
2547 path_get(&path);
Andrey Vaginba94f302017-02-01 11:00:45 -08002548
2549 fd = get_unused_fd_flags(O_CLOEXEC);
2550 if (fd < 0)
2551 goto out;
2552
2553 f = dentry_open(&path, O_PATH, current_cred());
2554 if (IS_ERR(f)) {
2555 put_unused_fd(fd);
2556 fd = PTR_ERR(f);
2557 goto out;
2558 }
2559
2560 fd_install(fd, f);
2561out:
2562 path_put(&path);
2563
2564 return fd;
2565}
2566
Linus Torvalds1da177e2005-04-16 15:20:36 -07002567static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
2568{
2569 struct sock *sk = sock->sk;
Jianjun Konge27dfce2008-11-01 21:38:31 -07002570 long amount = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002571 int err;
2572
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002573 switch (cmd) {
2574 case SIOCOUTQ:
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002575 amount = unix_outq_len(sk);
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002576 err = put_user(amount, (int __user *)arg);
2577 break;
2578 case SIOCINQ:
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002579 amount = unix_inq_len(sk);
2580 if (amount < 0)
2581 err = amount;
2582 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002583 err = put_user(amount, (int __user *)arg);
Pavel Emelyanov885ee742011-12-30 00:54:11 +00002584 break;
Andrey Vaginba94f302017-02-01 11:00:45 -08002585 case SIOCUNIXFILE:
2586 err = unix_open_file(sk);
2587 break;
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002588 default:
2589 err = -ENOIOCTLCMD;
2590 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002591 }
2592 return err;
2593}
2594
Arnd Bergmann5f6beb92019-06-03 22:03:44 +02002595#ifdef CONFIG_COMPAT
2596static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
2597{
2598 return unix_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
2599}
2600#endif
2601
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002602static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002603{
2604 struct sock *sk = sock->sk;
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002605 __poll_t mask;
2606
Karsten Graul89ab0662018-10-23 13:40:39 +02002607 sock_poll_wait(file, sock, wait);
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002608 mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002609
2610 /* exceptional events? */
2611 if (sk->sk_err)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002612 mask |= EPOLLERR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002613 if (sk->sk_shutdown == SHUTDOWN_MASK)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002614 mask |= EPOLLHUP;
Davide Libenzif348d702006-03-25 03:07:39 -08002615 if (sk->sk_shutdown & RCV_SHUTDOWN)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002616 mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002617
2618 /* readable? */
Eric Dumazet3ef7cf52019-10-23 22:44:50 -07002619 if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002620 mask |= EPOLLIN | EPOLLRDNORM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002621
2622 /* Connection-based need to check for termination and startup */
Eric Dumazet6eba6a32008-11-16 22:58:44 -08002623 if ((sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) &&
2624 sk->sk_state == TCP_CLOSE)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002625 mask |= EPOLLHUP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002626
2627 /*
2628 * we set writable also when the other side has shut down the
2629 * connection. This prevents stuck sockets.
2630 */
2631 if (unix_writable(sk))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002632 mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002633
2634 return mask;
2635}
2636
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002637static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,
2638 poll_table *wait)
Rainer Weikusat3c734192008-06-17 22:28:05 -07002639{
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002640 struct sock *sk = sock->sk, *other;
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002641 unsigned int writable;
2642 __poll_t mask;
2643
Karsten Graul89ab0662018-10-23 13:40:39 +02002644 sock_poll_wait(file, sock, wait);
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002645 mask = 0;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002646
2647 /* exceptional events? */
Eric Dumazet3ef7cf52019-10-23 22:44:50 -07002648 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002649 mask |= EPOLLERR |
2650 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0);
Keller, Jacob E7d4c04f2013-03-28 11:19:25 +00002651
Rainer Weikusat3c734192008-06-17 22:28:05 -07002652 if (sk->sk_shutdown & RCV_SHUTDOWN)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002653 mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002654 if (sk->sk_shutdown == SHUTDOWN_MASK)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002655 mask |= EPOLLHUP;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002656
2657 /* readable? */
Eric Dumazet3ef7cf52019-10-23 22:44:50 -07002658 if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002659 mask |= EPOLLIN | EPOLLRDNORM;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002660
2661 /* Connection-based need to check for termination and startup */
2662 if (sk->sk_type == SOCK_SEQPACKET) {
2663 if (sk->sk_state == TCP_CLOSE)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002664 mask |= EPOLLHUP;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002665 /* connection hasn't started yet? */
2666 if (sk->sk_state == TCP_SYN_SENT)
2667 return mask;
2668 }
2669
Eric Dumazet973a34a2010-10-31 05:38:25 +00002670 /* No write status requested, avoid expensive OUT tests. */
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07002671 if (!(poll_requested_events(wait) & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT)))
Eric Dumazet973a34a2010-10-31 05:38:25 +00002672 return mask;
2673
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002674 writable = unix_writable(sk);
Rainer Weikusat7d267272015-11-20 22:07:23 +00002675 if (writable) {
2676 unix_state_lock(sk);
2677
2678 other = unix_peer(sk);
2679 if (other && unix_peer(other) != sk &&
2680 unix_recvq_full(other) &&
2681 unix_dgram_peer_wake_me(sk, other))
2682 writable = 0;
2683
2684 unix_state_unlock(sk);
Rainer Weikusatec0d2152008-06-27 19:34:18 -07002685 }
2686
2687 if (writable)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002688 mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
Rainer Weikusat3c734192008-06-17 22:28:05 -07002689 else
Eric Dumazet9cd3e072015-11-29 20:03:10 -08002690 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
Rainer Weikusat3c734192008-06-17 22:28:05 -07002691
Rainer Weikusat3c734192008-06-17 22:28:05 -07002692 return mask;
2693}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002694
2695#ifdef CONFIG_PROC_FS
Pavel Emelyanova53eb3f2007-11-23 20:30:01 +08002696
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002697#define BUCKET_SPACE (BITS_PER_LONG - (UNIX_HASH_BITS + 1) - 1)
2698
2699#define get_bucket(x) ((x) >> BUCKET_SPACE)
2700#define get_offset(x) ((x) & ((1L << BUCKET_SPACE) - 1))
2701#define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o))
Pavel Emelyanova53eb3f2007-11-23 20:30:01 +08002702
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002703static struct sock *unix_from_bucket(struct seq_file *seq, loff_t *pos)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002704{
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002705 unsigned long offset = get_offset(*pos);
2706 unsigned long bucket = get_bucket(*pos);
2707 struct sock *sk;
2708 unsigned long count = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002709
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002710 for (sk = sk_head(&unix_socket_table[bucket]); sk; sk = sk_next(sk)) {
2711 if (sock_net(sk) != seq_file_net(seq))
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002712 continue;
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002713 if (++count == offset)
2714 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002715 }
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002716
2717 return sk;
2718}
2719
2720static struct sock *unix_next_socket(struct seq_file *seq,
2721 struct sock *sk,
2722 loff_t *pos)
2723{
2724 unsigned long bucket;
2725
2726 while (sk > (struct sock *)SEQ_START_TOKEN) {
2727 sk = sk_next(sk);
2728 if (!sk)
2729 goto next_bucket;
2730 if (sock_net(sk) == seq_file_net(seq))
2731 return sk;
2732 }
2733
2734 do {
2735 sk = unix_from_bucket(seq, pos);
2736 if (sk)
2737 return sk;
2738
2739next_bucket:
2740 bucket = get_bucket(*pos) + 1;
2741 *pos = set_bucket_offset(bucket, 1);
2742 } while (bucket < ARRAY_SIZE(unix_socket_table));
2743
Linus Torvalds1da177e2005-04-16 15:20:36 -07002744 return NULL;
2745}
2746
Linus Torvalds1da177e2005-04-16 15:20:36 -07002747static void *unix_seq_start(struct seq_file *seq, loff_t *pos)
Eric Dumazet9a429c42008-01-01 21:58:02 -08002748 __acquires(unix_table_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002749{
David S. Millerfbe9cc42005-12-13 23:26:29 -08002750 spin_lock(&unix_table_lock);
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002751
2752 if (!*pos)
2753 return SEQ_START_TOKEN;
2754
2755 if (get_bucket(*pos) >= ARRAY_SIZE(unix_socket_table))
2756 return NULL;
2757
2758 return unix_next_socket(seq, NULL, pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002759}
2760
2761static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2762{
2763 ++*pos;
Eric Dumazet7123aaa2012-06-08 05:03:21 +00002764 return unix_next_socket(seq, v, pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002765}
2766
2767static void unix_seq_stop(struct seq_file *seq, void *v)
Eric Dumazet9a429c42008-01-01 21:58:02 -08002768 __releases(unix_table_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002769{
David S. Millerfbe9cc42005-12-13 23:26:29 -08002770 spin_unlock(&unix_table_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002771}
2772
2773static int unix_seq_show(struct seq_file *seq, void *v)
2774{
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002775
Joe Perchesb9f31242008-04-12 19:04:38 -07002776 if (v == SEQ_START_TOKEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002777 seq_puts(seq, "Num RefCount Protocol Flags Type St "
2778 "Inode Path\n");
2779 else {
2780 struct sock *s = v;
2781 struct unix_sock *u = unix_sk(s);
David S. Miller1c92b4e2007-05-31 13:24:26 -07002782 unix_state_lock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002783
Dan Rosenberg71338aa2011-05-23 12:17:35 +00002784 seq_printf(seq, "%pK: %08X %08X %08X %04X %02X %5lu",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002785 s,
Reshetova, Elena41c6d652017-06-30 13:08:01 +03002786 refcount_read(&s->sk_refcnt),
Linus Torvalds1da177e2005-04-16 15:20:36 -07002787 0,
2788 s->sk_state == TCP_LISTEN ? __SO_ACCEPTCON : 0,
2789 s->sk_type,
2790 s->sk_socket ?
2791 (s->sk_state == TCP_ESTABLISHED ? SS_CONNECTED : SS_UNCONNECTED) :
2792 (s->sk_state == TCP_ESTABLISHED ? SS_CONNECTING : SS_DISCONNECTING),
2793 sock_i_ino(s));
2794
Al Viroae3b5642019-02-15 20:09:35 +00002795 if (u->addr) { // under unix_table_lock here
Linus Torvalds1da177e2005-04-16 15:20:36 -07002796 int i, len;
2797 seq_putc(seq, ' ');
2798
2799 i = 0;
2800 len = u->addr->len - sizeof(short);
2801 if (!UNIX_ABSTRACT(s))
2802 len--;
2803 else {
2804 seq_putc(seq, '@');
2805 i++;
2806 }
2807 for ( ; i < len; i++)
Isaac Boukrise7947ea2016-11-01 02:41:35 +02002808 seq_putc(seq, u->addr->name->sun_path[i] ?:
2809 '@');
Linus Torvalds1da177e2005-04-16 15:20:36 -07002810 }
David S. Miller1c92b4e2007-05-31 13:24:26 -07002811 unix_state_unlock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002812 seq_putc(seq, '\n');
2813 }
2814
2815 return 0;
2816}
2817
Philippe De Muyter56b3d972007-07-10 23:07:31 -07002818static const struct seq_operations unix_seq_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002819 .start = unix_seq_start,
2820 .next = unix_seq_next,
2821 .stop = unix_seq_stop,
2822 .show = unix_seq_show,
2823};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002824#endif
2825
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00002826static const struct net_proto_family unix_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002827 .family = PF_UNIX,
2828 .create = unix_create,
2829 .owner = THIS_MODULE,
2830};
2831
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002832
Alexey Dobriyan2c8c1e72010-01-17 03:35:32 +00002833static int __net_init unix_net_init(struct net *net)
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002834{
2835 int error = -ENOMEM;
2836
Denis V. Luneva0a53c82007-12-11 04:19:17 -08002837 net->unx.sysctl_max_dgram_qlen = 10;
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002838 if (unix_sysctl_register(net))
2839 goto out;
Pavel Emelyanovd392e492007-12-01 23:44:15 +11002840
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002841#ifdef CONFIG_PROC_FS
Christoph Hellwigc3506372018-04-10 19:42:55 +02002842 if (!proc_create_net("unix", 0, net->proc_net, &unix_seq_ops,
2843 sizeof(struct seq_net_private))) {
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002844 unix_sysctl_unregister(net);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002845 goto out;
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002846 }
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002847#endif
2848 error = 0;
2849out:
Jianjun Kong48dcc33e2008-11-01 21:37:27 -07002850 return error;
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002851}
2852
Alexey Dobriyan2c8c1e72010-01-17 03:35:32 +00002853static void __net_exit unix_net_exit(struct net *net)
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002854{
Pavel Emelyanov1597fbc2007-12-01 23:51:01 +11002855 unix_sysctl_unregister(net);
Gao fengece31ff2013-02-18 01:34:56 +00002856 remove_proc_entry("unix", net->proc_net);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002857}
2858
2859static struct pernet_operations unix_net_ops = {
2860 .init = unix_net_init,
2861 .exit = unix_net_exit,
2862};
2863
Linus Torvalds1da177e2005-04-16 15:20:36 -07002864static int __init af_unix_init(void)
2865{
2866 int rc = -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002867
Pankaj Bharadiyac5936422019-12-09 10:31:43 -08002868 BUILD_BUG_ON(sizeof(struct unix_skb_parms) > sizeof_field(struct sk_buff, cb));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869
2870 rc = proto_register(&unix_proto, 1);
YOSHIFUJI Hideakiac7bfa62007-02-09 23:25:23 +09002871 if (rc != 0) {
wangweidong5cc208b2013-12-06 18:03:36 +08002872 pr_crit("%s: Cannot create unix_sock SLAB cache!\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002873 goto out;
2874 }
2875
2876 sock_register(&unix_family_ops);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002877 register_pernet_subsys(&unix_net_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002878out:
2879 return rc;
2880}
2881
2882static void __exit af_unix_exit(void)
2883{
2884 sock_unregister(PF_UNIX);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885 proto_unregister(&unix_proto);
Denis V. Lunev097e66c2007-11-19 22:29:30 -08002886 unregister_pernet_subsys(&unix_net_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002887}
2888
David Woodhouse3d366962008-04-24 00:59:25 -07002889/* Earlier than device_initcall() so that other drivers invoking
2890 request_module() don't end up in a loop when modprobe tries
2891 to use a UNIX socket. But later than subsys_initcall() because
2892 we depend on stuff initialised there */
2893fs_initcall(af_unix_init);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002894module_exit(af_unix_exit);
2895
2896MODULE_LICENSE("GPL");
2897MODULE_ALIAS_NETPROTO(PF_UNIX);