1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * NET An implementation of the SOCKET network access protocol.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Version: @(#)socket.c 1.1.93 18/02/95
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Authors: Orest Zborowski, <obz@Kodak.COM>
8*4882a593Smuzhiyun * Ross Biro
9*4882a593Smuzhiyun * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * Fixes:
12*4882a593Smuzhiyun * Anonymous : NOTSOCK/BADF cleanup. Error fix in
13*4882a593Smuzhiyun * shutdown()
14*4882a593Smuzhiyun * Alan Cox : verify_area() fixes
15*4882a593Smuzhiyun * Alan Cox : Removed DDI
16*4882a593Smuzhiyun * Jonathan Kamens : SOCK_DGRAM reconnect bug
17*4882a593Smuzhiyun * Alan Cox : Moved a load of checks to the very
18*4882a593Smuzhiyun * top level.
19*4882a593Smuzhiyun * Alan Cox : Move address structures to/from user
20*4882a593Smuzhiyun * mode above the protocol layers.
21*4882a593Smuzhiyun * Rob Janssen : Allow 0 length sends.
22*4882a593Smuzhiyun * Alan Cox : Asynchronous I/O support (cribbed from the
23*4882a593Smuzhiyun * tty drivers).
24*4882a593Smuzhiyun * Niibe Yutaka : Asynchronous I/O for writes (4.4BSD style)
25*4882a593Smuzhiyun * Jeff Uphoff : Made max number of sockets command-line
26*4882a593Smuzhiyun * configurable.
27*4882a593Smuzhiyun * Matti Aarnio : Made the number of sockets dynamic,
28*4882a593Smuzhiyun * to be allocated when needed, and mr.
29*4882a593Smuzhiyun * Uphoff's max is used as max to be
30*4882a593Smuzhiyun * allowed to allocate.
31*4882a593Smuzhiyun * Linus : Argh. removed all the socket allocation
32*4882a593Smuzhiyun * altogether: it's in the inode now.
33*4882a593Smuzhiyun * Alan Cox : Made sock_alloc()/sock_release() public
34*4882a593Smuzhiyun * for NetROM and future kernel nfsd type
35*4882a593Smuzhiyun * stuff.
36*4882a593Smuzhiyun * Alan Cox : sendmsg/recvmsg basics.
37*4882a593Smuzhiyun * Tom Dyas : Export net symbols.
38*4882a593Smuzhiyun * Marcin Dalecki : Fixed problems with CONFIG_NET="n".
39*4882a593Smuzhiyun * Alan Cox : Added thread locking to sys_* calls
40*4882a593Smuzhiyun * for sockets. May have errors at the
41*4882a593Smuzhiyun * moment.
42*4882a593Smuzhiyun * Kevin Buhr : Fixed the dumb errors in the above.
43*4882a593Smuzhiyun * Andi Kleen : Some small cleanups, optimizations,
44*4882a593Smuzhiyun * and fixed a copy_from_user() bug.
45*4882a593Smuzhiyun * Tigran Aivazian : sys_send(args) calls sys_sendto(args, NULL, 0)
46*4882a593Smuzhiyun * Tigran Aivazian : Made listen(2) backlog sanity checks
47*4882a593Smuzhiyun * protocol-independent
48*4882a593Smuzhiyun *
49*4882a593Smuzhiyun * This module is effectively the top level interface to the BSD socket
50*4882a593Smuzhiyun * paradigm.
51*4882a593Smuzhiyun *
52*4882a593Smuzhiyun * Based upon Swansea University Computer Society NET3.039
53*4882a593Smuzhiyun */
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun #include <linux/mm.h>
56*4882a593Smuzhiyun #include <linux/socket.h>
57*4882a593Smuzhiyun #include <linux/file.h>
58*4882a593Smuzhiyun #include <linux/net.h>
59*4882a593Smuzhiyun #include <linux/interrupt.h>
60*4882a593Smuzhiyun #include <linux/thread_info.h>
61*4882a593Smuzhiyun #include <linux/rcupdate.h>
62*4882a593Smuzhiyun #include <linux/netdevice.h>
63*4882a593Smuzhiyun #include <linux/proc_fs.h>
64*4882a593Smuzhiyun #include <linux/seq_file.h>
65*4882a593Smuzhiyun #include <linux/mutex.h>
66*4882a593Smuzhiyun #include <linux/if_bridge.h>
67*4882a593Smuzhiyun #include <linux/if_frad.h>
68*4882a593Smuzhiyun #include <linux/if_vlan.h>
69*4882a593Smuzhiyun #include <linux/ptp_classify.h>
70*4882a593Smuzhiyun #include <linux/init.h>
71*4882a593Smuzhiyun #include <linux/poll.h>
72*4882a593Smuzhiyun #include <linux/cache.h>
73*4882a593Smuzhiyun #include <linux/module.h>
74*4882a593Smuzhiyun #include <linux/highmem.h>
75*4882a593Smuzhiyun #include <linux/mount.h>
76*4882a593Smuzhiyun #include <linux/pseudo_fs.h>
77*4882a593Smuzhiyun #include <linux/security.h>
78*4882a593Smuzhiyun #include <linux/syscalls.h>
79*4882a593Smuzhiyun #include <linux/compat.h>
80*4882a593Smuzhiyun #include <linux/kmod.h>
81*4882a593Smuzhiyun #include <linux/audit.h>
82*4882a593Smuzhiyun #include <linux/wireless.h>
83*4882a593Smuzhiyun #include <linux/nsproxy.h>
84*4882a593Smuzhiyun #include <linux/magic.h>
85*4882a593Smuzhiyun #include <linux/slab.h>
86*4882a593Smuzhiyun #include <linux/xattr.h>
87*4882a593Smuzhiyun #include <linux/nospec.h>
88*4882a593Smuzhiyun #include <linux/indirect_call_wrapper.h>
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun #include <linux/uaccess.h>
91*4882a593Smuzhiyun #include <asm/unistd.h>
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun #include <net/compat.h>
94*4882a593Smuzhiyun #include <net/wext.h>
95*4882a593Smuzhiyun #include <net/cls_cgroup.h>
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun #include <net/sock.h>
98*4882a593Smuzhiyun #include <linux/netfilter.h>
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun #include <linux/if_tun.h>
101*4882a593Smuzhiyun #include <linux/ipv6_route.h>
102*4882a593Smuzhiyun #include <linux/route.h>
103*4882a593Smuzhiyun #include <linux/termios.h>
104*4882a593Smuzhiyun #include <linux/sockios.h>
105*4882a593Smuzhiyun #include <net/busy_poll.h>
106*4882a593Smuzhiyun #include <linux/errqueue.h>
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun #ifdef CONFIG_NET_RX_BUSY_POLL
109*4882a593Smuzhiyun unsigned int sysctl_net_busy_read __read_mostly;
110*4882a593Smuzhiyun unsigned int sysctl_net_busy_poll __read_mostly;
111*4882a593Smuzhiyun #endif
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to);
114*4882a593Smuzhiyun static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from);
115*4882a593Smuzhiyun static int sock_mmap(struct file *file, struct vm_area_struct *vma);
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun static int sock_close(struct inode *inode, struct file *file);
118*4882a593Smuzhiyun static __poll_t sock_poll(struct file *file,
119*4882a593Smuzhiyun struct poll_table_struct *wait);
120*4882a593Smuzhiyun static long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
121*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
122*4882a593Smuzhiyun static long compat_sock_ioctl(struct file *file,
123*4882a593Smuzhiyun unsigned int cmd, unsigned long arg);
124*4882a593Smuzhiyun #endif
125*4882a593Smuzhiyun static int sock_fasync(int fd, struct file *filp, int on);
126*4882a593Smuzhiyun static ssize_t sock_sendpage(struct file *file, struct page *page,
127*4882a593Smuzhiyun int offset, size_t size, loff_t *ppos, int more);
128*4882a593Smuzhiyun static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
129*4882a593Smuzhiyun struct pipe_inode_info *pipe, size_t len,
130*4882a593Smuzhiyun unsigned int flags);
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
sock_show_fdinfo(struct seq_file * m,struct file * f)133*4882a593Smuzhiyun static void sock_show_fdinfo(struct seq_file *m, struct file *f)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun struct socket *sock = f->private_data;
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun if (sock->ops->show_fdinfo)
138*4882a593Smuzhiyun sock->ops->show_fdinfo(m, sock);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun #else
141*4882a593Smuzhiyun #define sock_show_fdinfo NULL
142*4882a593Smuzhiyun #endif
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun /*
145*4882a593Smuzhiyun * Socket files have a set of 'special' operations as well as the generic file ones. These don't appear
146*4882a593Smuzhiyun * in the operation structures but are done directly via the socketcall() multiplexor.
147*4882a593Smuzhiyun */
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun static const struct file_operations socket_file_ops = {
150*4882a593Smuzhiyun .owner = THIS_MODULE,
151*4882a593Smuzhiyun .llseek = no_llseek,
152*4882a593Smuzhiyun .read_iter = sock_read_iter,
153*4882a593Smuzhiyun .write_iter = sock_write_iter,
154*4882a593Smuzhiyun .poll = sock_poll,
155*4882a593Smuzhiyun .unlocked_ioctl = sock_ioctl,
156*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
157*4882a593Smuzhiyun .compat_ioctl = compat_sock_ioctl,
158*4882a593Smuzhiyun #endif
159*4882a593Smuzhiyun .mmap = sock_mmap,
160*4882a593Smuzhiyun .release = sock_close,
161*4882a593Smuzhiyun .fasync = sock_fasync,
162*4882a593Smuzhiyun .sendpage = sock_sendpage,
163*4882a593Smuzhiyun .splice_write = generic_splice_sendpage,
164*4882a593Smuzhiyun .splice_read = sock_splice_read,
165*4882a593Smuzhiyun .show_fdinfo = sock_show_fdinfo,
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun /*
169*4882a593Smuzhiyun * The protocol list. Each protocol is registered in here.
170*4882a593Smuzhiyun */
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun static DEFINE_SPINLOCK(net_family_lock);
173*4882a593Smuzhiyun static const struct net_proto_family __rcu *net_families[NPROTO] __read_mostly;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun /*
176*4882a593Smuzhiyun * Support routines.
177*4882a593Smuzhiyun * Move socket addresses back and forth across the kernel/user
178*4882a593Smuzhiyun * divide and look after the messy bits.
179*4882a593Smuzhiyun */
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun /**
182*4882a593Smuzhiyun * move_addr_to_kernel - copy a socket address into kernel space
183*4882a593Smuzhiyun * @uaddr: Address in user space
184*4882a593Smuzhiyun * @kaddr: Address in kernel space
185*4882a593Smuzhiyun * @ulen: Length in user space
186*4882a593Smuzhiyun *
187*4882a593Smuzhiyun * The address is copied into kernel space. If the provided address is
188*4882a593Smuzhiyun * too long an error code of -EINVAL is returned. If the copy gives
189*4882a593Smuzhiyun * invalid addresses -EFAULT is returned. On a success 0 is returned.
190*4882a593Smuzhiyun */
191*4882a593Smuzhiyun
move_addr_to_kernel(void __user * uaddr,int ulen,struct sockaddr_storage * kaddr)192*4882a593Smuzhiyun int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun if (ulen < 0 || ulen > sizeof(struct sockaddr_storage))
195*4882a593Smuzhiyun return -EINVAL;
196*4882a593Smuzhiyun if (ulen == 0)
197*4882a593Smuzhiyun return 0;
198*4882a593Smuzhiyun if (copy_from_user(kaddr, uaddr, ulen))
199*4882a593Smuzhiyun return -EFAULT;
200*4882a593Smuzhiyun return audit_sockaddr(ulen, kaddr);
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun /**
204*4882a593Smuzhiyun * move_addr_to_user - copy an address to user space
205*4882a593Smuzhiyun * @kaddr: kernel space address
206*4882a593Smuzhiyun * @klen: length of address in kernel
207*4882a593Smuzhiyun * @uaddr: user space address
208*4882a593Smuzhiyun * @ulen: pointer to user length field
209*4882a593Smuzhiyun *
210*4882a593Smuzhiyun * The value pointed to by ulen on entry is the buffer length available.
211*4882a593Smuzhiyun * This is overwritten with the buffer space used. -EINVAL is returned
212*4882a593Smuzhiyun * if an overlong buffer is specified or a negative buffer size. -EFAULT
213*4882a593Smuzhiyun * is returned if either the buffer or the length field are not
214*4882a593Smuzhiyun * accessible.
215*4882a593Smuzhiyun * After copying the data up to the limit the user specifies, the true
216*4882a593Smuzhiyun * length of the data is written over the length limit the user
217*4882a593Smuzhiyun * specified. Zero is returned for a success.
218*4882a593Smuzhiyun */
219*4882a593Smuzhiyun
move_addr_to_user(struct sockaddr_storage * kaddr,int klen,void __user * uaddr,int __user * ulen)220*4882a593Smuzhiyun static int move_addr_to_user(struct sockaddr_storage *kaddr, int klen,
221*4882a593Smuzhiyun void __user *uaddr, int __user *ulen)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun int err;
224*4882a593Smuzhiyun int len;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun BUG_ON(klen > sizeof(struct sockaddr_storage));
227*4882a593Smuzhiyun err = get_user(len, ulen);
228*4882a593Smuzhiyun if (err)
229*4882a593Smuzhiyun return err;
230*4882a593Smuzhiyun if (len > klen)
231*4882a593Smuzhiyun len = klen;
232*4882a593Smuzhiyun if (len < 0)
233*4882a593Smuzhiyun return -EINVAL;
234*4882a593Smuzhiyun if (len) {
235*4882a593Smuzhiyun if (audit_sockaddr(klen, kaddr))
236*4882a593Smuzhiyun return -ENOMEM;
237*4882a593Smuzhiyun if (copy_to_user(uaddr, kaddr, len))
238*4882a593Smuzhiyun return -EFAULT;
239*4882a593Smuzhiyun }
240*4882a593Smuzhiyun /*
241*4882a593Smuzhiyun * "fromlen shall refer to the value before truncation.."
242*4882a593Smuzhiyun * 1003.1g
243*4882a593Smuzhiyun */
244*4882a593Smuzhiyun return __put_user(klen, ulen);
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun static struct kmem_cache *sock_inode_cachep __ro_after_init;
248*4882a593Smuzhiyun
sock_alloc_inode(struct super_block * sb)249*4882a593Smuzhiyun static struct inode *sock_alloc_inode(struct super_block *sb)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun struct socket_alloc *ei;
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL);
254*4882a593Smuzhiyun if (!ei)
255*4882a593Smuzhiyun return NULL;
256*4882a593Smuzhiyun init_waitqueue_head(&ei->socket.wq.wait);
257*4882a593Smuzhiyun ei->socket.wq.fasync_list = NULL;
258*4882a593Smuzhiyun ei->socket.wq.flags = 0;
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun ei->socket.state = SS_UNCONNECTED;
261*4882a593Smuzhiyun ei->socket.flags = 0;
262*4882a593Smuzhiyun ei->socket.ops = NULL;
263*4882a593Smuzhiyun ei->socket.sk = NULL;
264*4882a593Smuzhiyun ei->socket.file = NULL;
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun return &ei->vfs_inode;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
sock_free_inode(struct inode * inode)269*4882a593Smuzhiyun static void sock_free_inode(struct inode *inode)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun struct socket_alloc *ei;
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun ei = container_of(inode, struct socket_alloc, vfs_inode);
274*4882a593Smuzhiyun kmem_cache_free(sock_inode_cachep, ei);
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun
init_once(void * foo)277*4882a593Smuzhiyun static void init_once(void *foo)
278*4882a593Smuzhiyun {
279*4882a593Smuzhiyun struct socket_alloc *ei = (struct socket_alloc *)foo;
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun inode_init_once(&ei->vfs_inode);
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
init_inodecache(void)284*4882a593Smuzhiyun static void init_inodecache(void)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun sock_inode_cachep = kmem_cache_create("sock_inode_cache",
287*4882a593Smuzhiyun sizeof(struct socket_alloc),
288*4882a593Smuzhiyun 0,
289*4882a593Smuzhiyun (SLAB_HWCACHE_ALIGN |
290*4882a593Smuzhiyun SLAB_RECLAIM_ACCOUNT |
291*4882a593Smuzhiyun SLAB_MEM_SPREAD | SLAB_ACCOUNT),
292*4882a593Smuzhiyun init_once);
293*4882a593Smuzhiyun BUG_ON(sock_inode_cachep == NULL);
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun static const struct super_operations sockfs_ops = {
297*4882a593Smuzhiyun .alloc_inode = sock_alloc_inode,
298*4882a593Smuzhiyun .free_inode = sock_free_inode,
299*4882a593Smuzhiyun .statfs = simple_statfs,
300*4882a593Smuzhiyun };
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun /*
303*4882a593Smuzhiyun * sockfs_dname() is called from d_path().
304*4882a593Smuzhiyun */
sockfs_dname(struct dentry * dentry,char * buffer,int buflen)305*4882a593Smuzhiyun static char *sockfs_dname(struct dentry *dentry, char *buffer, int buflen)
306*4882a593Smuzhiyun {
307*4882a593Smuzhiyun return dynamic_dname(dentry, buffer, buflen, "socket:[%lu]",
308*4882a593Smuzhiyun d_inode(dentry)->i_ino);
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun static const struct dentry_operations sockfs_dentry_operations = {
312*4882a593Smuzhiyun .d_dname = sockfs_dname,
313*4882a593Smuzhiyun };
314*4882a593Smuzhiyun
sockfs_xattr_get(const struct xattr_handler * handler,struct dentry * dentry,struct inode * inode,const char * suffix,void * value,size_t size,int flags)315*4882a593Smuzhiyun static int sockfs_xattr_get(const struct xattr_handler *handler,
316*4882a593Smuzhiyun struct dentry *dentry, struct inode *inode,
317*4882a593Smuzhiyun const char *suffix, void *value, size_t size,
318*4882a593Smuzhiyun int flags)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun if (value) {
321*4882a593Smuzhiyun if (dentry->d_name.len + 1 > size)
322*4882a593Smuzhiyun return -ERANGE;
323*4882a593Smuzhiyun memcpy(value, dentry->d_name.name, dentry->d_name.len + 1);
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun return dentry->d_name.len + 1;
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun #define XATTR_SOCKPROTONAME_SUFFIX "sockprotoname"
329*4882a593Smuzhiyun #define XATTR_NAME_SOCKPROTONAME (XATTR_SYSTEM_PREFIX XATTR_SOCKPROTONAME_SUFFIX)
330*4882a593Smuzhiyun #define XATTR_NAME_SOCKPROTONAME_LEN (sizeof(XATTR_NAME_SOCKPROTONAME)-1)
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun static const struct xattr_handler sockfs_xattr_handler = {
333*4882a593Smuzhiyun .name = XATTR_NAME_SOCKPROTONAME,
334*4882a593Smuzhiyun .get = sockfs_xattr_get,
335*4882a593Smuzhiyun };
336*4882a593Smuzhiyun
sockfs_security_xattr_set(const struct xattr_handler * handler,struct dentry * dentry,struct inode * inode,const char * suffix,const void * value,size_t size,int flags)337*4882a593Smuzhiyun static int sockfs_security_xattr_set(const struct xattr_handler *handler,
338*4882a593Smuzhiyun struct dentry *dentry, struct inode *inode,
339*4882a593Smuzhiyun const char *suffix, const void *value,
340*4882a593Smuzhiyun size_t size, int flags)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun /* Handled by LSM. */
343*4882a593Smuzhiyun return -EAGAIN;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun static const struct xattr_handler sockfs_security_xattr_handler = {
347*4882a593Smuzhiyun .prefix = XATTR_SECURITY_PREFIX,
348*4882a593Smuzhiyun .set = sockfs_security_xattr_set,
349*4882a593Smuzhiyun };
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun static const struct xattr_handler *sockfs_xattr_handlers[] = {
352*4882a593Smuzhiyun &sockfs_xattr_handler,
353*4882a593Smuzhiyun &sockfs_security_xattr_handler,
354*4882a593Smuzhiyun NULL
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun
sockfs_init_fs_context(struct fs_context * fc)357*4882a593Smuzhiyun static int sockfs_init_fs_context(struct fs_context *fc)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun struct pseudo_fs_context *ctx = init_pseudo(fc, SOCKFS_MAGIC);
360*4882a593Smuzhiyun if (!ctx)
361*4882a593Smuzhiyun return -ENOMEM;
362*4882a593Smuzhiyun ctx->ops = &sockfs_ops;
363*4882a593Smuzhiyun ctx->dops = &sockfs_dentry_operations;
364*4882a593Smuzhiyun ctx->xattr = sockfs_xattr_handlers;
365*4882a593Smuzhiyun return 0;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun static struct vfsmount *sock_mnt __read_mostly;
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun static struct file_system_type sock_fs_type = {
371*4882a593Smuzhiyun .name = "sockfs",
372*4882a593Smuzhiyun .init_fs_context = sockfs_init_fs_context,
373*4882a593Smuzhiyun .kill_sb = kill_anon_super,
374*4882a593Smuzhiyun };
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun /*
377*4882a593Smuzhiyun * Obtains the first available file descriptor and sets it up for use.
378*4882a593Smuzhiyun *
379*4882a593Smuzhiyun * These functions create file structures and maps them to fd space
380*4882a593Smuzhiyun * of the current process. On success it returns file descriptor
381*4882a593Smuzhiyun * and file struct implicitly stored in sock->file.
382*4882a593Smuzhiyun * Note that another thread may close file descriptor before we return
383*4882a593Smuzhiyun * from this function. We use the fact that now we do not refer
384*4882a593Smuzhiyun * to socket after mapping. If one day we will need it, this
385*4882a593Smuzhiyun * function will increment ref. count on file by 1.
386*4882a593Smuzhiyun *
387*4882a593Smuzhiyun * In any case returned fd MAY BE not valid!
388*4882a593Smuzhiyun * This race condition is unavoidable
389*4882a593Smuzhiyun * with shared fd spaces, we cannot solve it inside kernel,
390*4882a593Smuzhiyun * but we take care of internal coherence yet.
391*4882a593Smuzhiyun */
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun /**
394*4882a593Smuzhiyun * sock_alloc_file - Bind a &socket to a &file
395*4882a593Smuzhiyun * @sock: socket
396*4882a593Smuzhiyun * @flags: file status flags
397*4882a593Smuzhiyun * @dname: protocol name
398*4882a593Smuzhiyun *
399*4882a593Smuzhiyun * Returns the &file bound with @sock, implicitly storing it
400*4882a593Smuzhiyun * in sock->file. If dname is %NULL, sets to "".
401*4882a593Smuzhiyun * On failure the return is a ERR pointer (see linux/err.h).
402*4882a593Smuzhiyun * This function uses GFP_KERNEL internally.
403*4882a593Smuzhiyun */
404*4882a593Smuzhiyun
sock_alloc_file(struct socket * sock,int flags,const char * dname)405*4882a593Smuzhiyun struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname)
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun struct file *file;
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun if (!dname)
410*4882a593Smuzhiyun dname = sock->sk ? sock->sk->sk_prot_creator->name : "";
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun file = alloc_file_pseudo(SOCK_INODE(sock), sock_mnt, dname,
413*4882a593Smuzhiyun O_RDWR | (flags & O_NONBLOCK),
414*4882a593Smuzhiyun &socket_file_ops);
415*4882a593Smuzhiyun if (IS_ERR(file)) {
416*4882a593Smuzhiyun sock_release(sock);
417*4882a593Smuzhiyun return file;
418*4882a593Smuzhiyun }
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun sock->file = file;
421*4882a593Smuzhiyun file->private_data = sock;
422*4882a593Smuzhiyun stream_open(SOCK_INODE(sock), file);
423*4882a593Smuzhiyun return file;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun EXPORT_SYMBOL(sock_alloc_file);
426*4882a593Smuzhiyun
sock_map_fd(struct socket * sock,int flags)427*4882a593Smuzhiyun static int sock_map_fd(struct socket *sock, int flags)
428*4882a593Smuzhiyun {
429*4882a593Smuzhiyun struct file *newfile;
430*4882a593Smuzhiyun int fd = get_unused_fd_flags(flags);
431*4882a593Smuzhiyun if (unlikely(fd < 0)) {
432*4882a593Smuzhiyun sock_release(sock);
433*4882a593Smuzhiyun return fd;
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun newfile = sock_alloc_file(sock, flags, NULL);
437*4882a593Smuzhiyun if (!IS_ERR(newfile)) {
438*4882a593Smuzhiyun fd_install(fd, newfile);
439*4882a593Smuzhiyun return fd;
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun put_unused_fd(fd);
443*4882a593Smuzhiyun return PTR_ERR(newfile);
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun /**
447*4882a593Smuzhiyun * sock_from_file - Return the &socket bounded to @file.
448*4882a593Smuzhiyun * @file: file
449*4882a593Smuzhiyun * @err: pointer to an error code return
450*4882a593Smuzhiyun *
451*4882a593Smuzhiyun * On failure returns %NULL and assigns -ENOTSOCK to @err.
452*4882a593Smuzhiyun */
453*4882a593Smuzhiyun
sock_from_file(struct file * file,int * err)454*4882a593Smuzhiyun struct socket *sock_from_file(struct file *file, int *err)
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun if (file->f_op == &socket_file_ops)
457*4882a593Smuzhiyun return file->private_data; /* set in sock_map_fd */
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun *err = -ENOTSOCK;
460*4882a593Smuzhiyun return NULL;
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun EXPORT_SYMBOL(sock_from_file);
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun /**
465*4882a593Smuzhiyun * sockfd_lookup - Go from a file number to its socket slot
466*4882a593Smuzhiyun * @fd: file handle
467*4882a593Smuzhiyun * @err: pointer to an error code return
468*4882a593Smuzhiyun *
469*4882a593Smuzhiyun * The file handle passed in is locked and the socket it is bound
470*4882a593Smuzhiyun * to is returned. If an error occurs the err pointer is overwritten
471*4882a593Smuzhiyun * with a negative errno code and NULL is returned. The function checks
472*4882a593Smuzhiyun * for both invalid handles and passing a handle which is not a socket.
473*4882a593Smuzhiyun *
474*4882a593Smuzhiyun * On a success the socket object pointer is returned.
475*4882a593Smuzhiyun */
476*4882a593Smuzhiyun
sockfd_lookup(int fd,int * err)477*4882a593Smuzhiyun struct socket *sockfd_lookup(int fd, int *err)
478*4882a593Smuzhiyun {
479*4882a593Smuzhiyun struct file *file;
480*4882a593Smuzhiyun struct socket *sock;
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun file = fget(fd);
483*4882a593Smuzhiyun if (!file) {
484*4882a593Smuzhiyun *err = -EBADF;
485*4882a593Smuzhiyun return NULL;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun sock = sock_from_file(file, err);
489*4882a593Smuzhiyun if (!sock)
490*4882a593Smuzhiyun fput(file);
491*4882a593Smuzhiyun return sock;
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun EXPORT_SYMBOL(sockfd_lookup);
494*4882a593Smuzhiyun
sockfd_lookup_light(int fd,int * err,int * fput_needed)495*4882a593Smuzhiyun static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed)
496*4882a593Smuzhiyun {
497*4882a593Smuzhiyun struct fd f = fdget(fd);
498*4882a593Smuzhiyun struct socket *sock;
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun *err = -EBADF;
501*4882a593Smuzhiyun if (f.file) {
502*4882a593Smuzhiyun sock = sock_from_file(f.file, err);
503*4882a593Smuzhiyun if (likely(sock)) {
504*4882a593Smuzhiyun *fput_needed = f.flags & FDPUT_FPUT;
505*4882a593Smuzhiyun return sock;
506*4882a593Smuzhiyun }
507*4882a593Smuzhiyun fdput(f);
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun return NULL;
510*4882a593Smuzhiyun }
511*4882a593Smuzhiyun
sockfs_listxattr(struct dentry * dentry,char * buffer,size_t size)512*4882a593Smuzhiyun static ssize_t sockfs_listxattr(struct dentry *dentry, char *buffer,
513*4882a593Smuzhiyun size_t size)
514*4882a593Smuzhiyun {
515*4882a593Smuzhiyun ssize_t len;
516*4882a593Smuzhiyun ssize_t used = 0;
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun len = security_inode_listsecurity(d_inode(dentry), buffer, size);
519*4882a593Smuzhiyun if (len < 0)
520*4882a593Smuzhiyun return len;
521*4882a593Smuzhiyun used += len;
522*4882a593Smuzhiyun if (buffer) {
523*4882a593Smuzhiyun if (size < used)
524*4882a593Smuzhiyun return -ERANGE;
525*4882a593Smuzhiyun buffer += len;
526*4882a593Smuzhiyun }
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun len = (XATTR_NAME_SOCKPROTONAME_LEN + 1);
529*4882a593Smuzhiyun used += len;
530*4882a593Smuzhiyun if (buffer) {
531*4882a593Smuzhiyun if (size < used)
532*4882a593Smuzhiyun return -ERANGE;
533*4882a593Smuzhiyun memcpy(buffer, XATTR_NAME_SOCKPROTONAME, len);
534*4882a593Smuzhiyun buffer += len;
535*4882a593Smuzhiyun }
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun return used;
538*4882a593Smuzhiyun }
539*4882a593Smuzhiyun
sockfs_setattr(struct dentry * dentry,struct iattr * iattr)540*4882a593Smuzhiyun static int sockfs_setattr(struct dentry *dentry, struct iattr *iattr)
541*4882a593Smuzhiyun {
542*4882a593Smuzhiyun int err = simple_setattr(dentry, iattr);
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun if (!err && (iattr->ia_valid & ATTR_UID)) {
545*4882a593Smuzhiyun struct socket *sock = SOCKET_I(d_inode(dentry));
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun if (sock->sk)
548*4882a593Smuzhiyun sock->sk->sk_uid = iattr->ia_uid;
549*4882a593Smuzhiyun else
550*4882a593Smuzhiyun err = -ENOENT;
551*4882a593Smuzhiyun }
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun return err;
554*4882a593Smuzhiyun }
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun static const struct inode_operations sockfs_inode_ops = {
557*4882a593Smuzhiyun .listxattr = sockfs_listxattr,
558*4882a593Smuzhiyun .setattr = sockfs_setattr,
559*4882a593Smuzhiyun };
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun /**
562*4882a593Smuzhiyun * sock_alloc - allocate a socket
563*4882a593Smuzhiyun *
564*4882a593Smuzhiyun * Allocate a new inode and socket object. The two are bound together
565*4882a593Smuzhiyun * and initialised. The socket is then returned. If we are out of inodes
566*4882a593Smuzhiyun * NULL is returned. This functions uses GFP_KERNEL internally.
567*4882a593Smuzhiyun */
568*4882a593Smuzhiyun
sock_alloc(void)569*4882a593Smuzhiyun struct socket *sock_alloc(void)
570*4882a593Smuzhiyun {
571*4882a593Smuzhiyun struct inode *inode;
572*4882a593Smuzhiyun struct socket *sock;
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun inode = new_inode_pseudo(sock_mnt->mnt_sb);
575*4882a593Smuzhiyun if (!inode)
576*4882a593Smuzhiyun return NULL;
577*4882a593Smuzhiyun
578*4882a593Smuzhiyun sock = SOCKET_I(inode);
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun inode->i_ino = get_next_ino();
581*4882a593Smuzhiyun inode->i_mode = S_IFSOCK | S_IRWXUGO;
582*4882a593Smuzhiyun inode->i_uid = current_fsuid();
583*4882a593Smuzhiyun inode->i_gid = current_fsgid();
584*4882a593Smuzhiyun inode->i_op = &sockfs_inode_ops;
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun return sock;
587*4882a593Smuzhiyun }
588*4882a593Smuzhiyun EXPORT_SYMBOL(sock_alloc);
589*4882a593Smuzhiyun
__sock_release(struct socket * sock,struct inode * inode)590*4882a593Smuzhiyun static void __sock_release(struct socket *sock, struct inode *inode)
591*4882a593Smuzhiyun {
592*4882a593Smuzhiyun if (sock->ops) {
593*4882a593Smuzhiyun struct module *owner = sock->ops->owner;
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun if (inode)
596*4882a593Smuzhiyun inode_lock(inode);
597*4882a593Smuzhiyun sock->ops->release(sock);
598*4882a593Smuzhiyun sock->sk = NULL;
599*4882a593Smuzhiyun if (inode)
600*4882a593Smuzhiyun inode_unlock(inode);
601*4882a593Smuzhiyun sock->ops = NULL;
602*4882a593Smuzhiyun module_put(owner);
603*4882a593Smuzhiyun }
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun if (sock->wq.fasync_list)
606*4882a593Smuzhiyun pr_err("%s: fasync list not empty!\n", __func__);
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun if (!sock->file) {
609*4882a593Smuzhiyun iput(SOCK_INODE(sock));
610*4882a593Smuzhiyun return;
611*4882a593Smuzhiyun }
612*4882a593Smuzhiyun sock->file = NULL;
613*4882a593Smuzhiyun }
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun /**
616*4882a593Smuzhiyun * sock_release - close a socket
617*4882a593Smuzhiyun * @sock: socket to close
618*4882a593Smuzhiyun *
619*4882a593Smuzhiyun * The socket is released from the protocol stack if it has a release
620*4882a593Smuzhiyun * callback, and the inode is then released if the socket is bound to
621*4882a593Smuzhiyun * an inode not a file.
622*4882a593Smuzhiyun */
sock_release(struct socket * sock)623*4882a593Smuzhiyun void sock_release(struct socket *sock)
624*4882a593Smuzhiyun {
625*4882a593Smuzhiyun __sock_release(sock, NULL);
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun EXPORT_SYMBOL(sock_release);
628*4882a593Smuzhiyun
__sock_tx_timestamp(__u16 tsflags,__u8 * tx_flags)629*4882a593Smuzhiyun void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags)
630*4882a593Smuzhiyun {
631*4882a593Smuzhiyun u8 flags = *tx_flags;
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun if (tsflags & SOF_TIMESTAMPING_TX_HARDWARE)
634*4882a593Smuzhiyun flags |= SKBTX_HW_TSTAMP;
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun if (tsflags & SOF_TIMESTAMPING_TX_SOFTWARE)
637*4882a593Smuzhiyun flags |= SKBTX_SW_TSTAMP;
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun if (tsflags & SOF_TIMESTAMPING_TX_SCHED)
640*4882a593Smuzhiyun flags |= SKBTX_SCHED_TSTAMP;
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun *tx_flags = flags;
643*4882a593Smuzhiyun }
644*4882a593Smuzhiyun EXPORT_SYMBOL(__sock_tx_timestamp);
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun INDIRECT_CALLABLE_DECLARE(int inet_sendmsg(struct socket *, struct msghdr *,
647*4882a593Smuzhiyun size_t));
648*4882a593Smuzhiyun INDIRECT_CALLABLE_DECLARE(int inet6_sendmsg(struct socket *, struct msghdr *,
649*4882a593Smuzhiyun size_t));
sock_sendmsg_nosec(struct socket * sock,struct msghdr * msg)650*4882a593Smuzhiyun static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
651*4882a593Smuzhiyun {
652*4882a593Smuzhiyun int ret = INDIRECT_CALL_INET(sock->ops->sendmsg, inet6_sendmsg,
653*4882a593Smuzhiyun inet_sendmsg, sock, msg,
654*4882a593Smuzhiyun msg_data_left(msg));
655*4882a593Smuzhiyun BUG_ON(ret == -EIOCBQUEUED);
656*4882a593Smuzhiyun return ret;
657*4882a593Smuzhiyun }
658*4882a593Smuzhiyun
659*4882a593Smuzhiyun /**
660*4882a593Smuzhiyun * sock_sendmsg - send a message through @sock
661*4882a593Smuzhiyun * @sock: socket
662*4882a593Smuzhiyun * @msg: message to send
663*4882a593Smuzhiyun *
664*4882a593Smuzhiyun * Sends @msg through @sock, passing through LSM.
665*4882a593Smuzhiyun * Returns the number of bytes sent, or an error code.
666*4882a593Smuzhiyun */
sock_sendmsg(struct socket * sock,struct msghdr * msg)667*4882a593Smuzhiyun int sock_sendmsg(struct socket *sock, struct msghdr *msg)
668*4882a593Smuzhiyun {
669*4882a593Smuzhiyun int err = security_socket_sendmsg(sock, msg,
670*4882a593Smuzhiyun msg_data_left(msg));
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun return err ?: sock_sendmsg_nosec(sock, msg);
673*4882a593Smuzhiyun }
674*4882a593Smuzhiyun EXPORT_SYMBOL(sock_sendmsg);
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun /**
677*4882a593Smuzhiyun * kernel_sendmsg - send a message through @sock (kernel-space)
678*4882a593Smuzhiyun * @sock: socket
679*4882a593Smuzhiyun * @msg: message header
680*4882a593Smuzhiyun * @vec: kernel vec
681*4882a593Smuzhiyun * @num: vec array length
682*4882a593Smuzhiyun * @size: total message data size
683*4882a593Smuzhiyun *
684*4882a593Smuzhiyun * Builds the message data with @vec and sends it through @sock.
685*4882a593Smuzhiyun * Returns the number of bytes sent, or an error code.
686*4882a593Smuzhiyun */
687*4882a593Smuzhiyun
kernel_sendmsg(struct socket * sock,struct msghdr * msg,struct kvec * vec,size_t num,size_t size)688*4882a593Smuzhiyun int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
689*4882a593Smuzhiyun struct kvec *vec, size_t num, size_t size)
690*4882a593Smuzhiyun {
691*4882a593Smuzhiyun iov_iter_kvec(&msg->msg_iter, WRITE, vec, num, size);
692*4882a593Smuzhiyun return sock_sendmsg(sock, msg);
693*4882a593Smuzhiyun }
694*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_sendmsg);
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun /**
697*4882a593Smuzhiyun * kernel_sendmsg_locked - send a message through @sock (kernel-space)
698*4882a593Smuzhiyun * @sk: sock
699*4882a593Smuzhiyun * @msg: message header
700*4882a593Smuzhiyun * @vec: output s/g array
701*4882a593Smuzhiyun * @num: output s/g array length
702*4882a593Smuzhiyun * @size: total message data size
703*4882a593Smuzhiyun *
704*4882a593Smuzhiyun * Builds the message data with @vec and sends it through @sock.
705*4882a593Smuzhiyun * Returns the number of bytes sent, or an error code.
706*4882a593Smuzhiyun * Caller must hold @sk.
707*4882a593Smuzhiyun */
708*4882a593Smuzhiyun
kernel_sendmsg_locked(struct sock * sk,struct msghdr * msg,struct kvec * vec,size_t num,size_t size)709*4882a593Smuzhiyun int kernel_sendmsg_locked(struct sock *sk, struct msghdr *msg,
710*4882a593Smuzhiyun struct kvec *vec, size_t num, size_t size)
711*4882a593Smuzhiyun {
712*4882a593Smuzhiyun struct socket *sock = sk->sk_socket;
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun if (!sock->ops->sendmsg_locked)
715*4882a593Smuzhiyun return sock_no_sendmsg_locked(sk, msg, size);
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun iov_iter_kvec(&msg->msg_iter, WRITE, vec, num, size);
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun return sock->ops->sendmsg_locked(sk, msg, msg_data_left(msg));
720*4882a593Smuzhiyun }
721*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_sendmsg_locked);
722*4882a593Smuzhiyun
skb_is_err_queue(const struct sk_buff * skb)723*4882a593Smuzhiyun static bool skb_is_err_queue(const struct sk_buff *skb)
724*4882a593Smuzhiyun {
725*4882a593Smuzhiyun /* pkt_type of skbs enqueued on the error queue are set to
726*4882a593Smuzhiyun * PACKET_OUTGOING in skb_set_err_queue(). This is only safe to do
727*4882a593Smuzhiyun * in recvmsg, since skbs received on a local socket will never
728*4882a593Smuzhiyun * have a pkt_type of PACKET_OUTGOING.
729*4882a593Smuzhiyun */
730*4882a593Smuzhiyun return skb->pkt_type == PACKET_OUTGOING;
731*4882a593Smuzhiyun }
732*4882a593Smuzhiyun
733*4882a593Smuzhiyun /* On transmit, software and hardware timestamps are returned independently.
734*4882a593Smuzhiyun * As the two skb clones share the hardware timestamp, which may be updated
735*4882a593Smuzhiyun * before the software timestamp is received, a hardware TX timestamp may be
736*4882a593Smuzhiyun * returned only if there is no software TX timestamp. Ignore false software
737*4882a593Smuzhiyun * timestamps, which may be made in the __sock_recv_timestamp() call when the
738*4882a593Smuzhiyun * option SO_TIMESTAMP_OLD(NS) is enabled on the socket, even when the skb has a
739*4882a593Smuzhiyun * hardware timestamp.
740*4882a593Smuzhiyun */
skb_is_swtx_tstamp(const struct sk_buff * skb,int false_tstamp)741*4882a593Smuzhiyun static bool skb_is_swtx_tstamp(const struct sk_buff *skb, int false_tstamp)
742*4882a593Smuzhiyun {
743*4882a593Smuzhiyun return skb->tstamp && !false_tstamp && skb_is_err_queue(skb);
744*4882a593Smuzhiyun }
745*4882a593Smuzhiyun
put_ts_pktinfo(struct msghdr * msg,struct sk_buff * skb)746*4882a593Smuzhiyun static void put_ts_pktinfo(struct msghdr *msg, struct sk_buff *skb)
747*4882a593Smuzhiyun {
748*4882a593Smuzhiyun struct scm_ts_pktinfo ts_pktinfo;
749*4882a593Smuzhiyun struct net_device *orig_dev;
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun if (!skb_mac_header_was_set(skb))
752*4882a593Smuzhiyun return;
753*4882a593Smuzhiyun
754*4882a593Smuzhiyun memset(&ts_pktinfo, 0, sizeof(ts_pktinfo));
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun rcu_read_lock();
757*4882a593Smuzhiyun orig_dev = dev_get_by_napi_id(skb_napi_id(skb));
758*4882a593Smuzhiyun if (orig_dev)
759*4882a593Smuzhiyun ts_pktinfo.if_index = orig_dev->ifindex;
760*4882a593Smuzhiyun rcu_read_unlock();
761*4882a593Smuzhiyun
762*4882a593Smuzhiyun ts_pktinfo.pkt_length = skb->len - skb_mac_offset(skb);
763*4882a593Smuzhiyun put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPING_PKTINFO,
764*4882a593Smuzhiyun sizeof(ts_pktinfo), &ts_pktinfo);
765*4882a593Smuzhiyun }
766*4882a593Smuzhiyun
767*4882a593Smuzhiyun /*
768*4882a593Smuzhiyun * called from sock_recv_timestamp() if sock_flag(sk, SOCK_RCVTSTAMP)
769*4882a593Smuzhiyun */
__sock_recv_timestamp(struct msghdr * msg,struct sock * sk,struct sk_buff * skb)770*4882a593Smuzhiyun void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
771*4882a593Smuzhiyun struct sk_buff *skb)
772*4882a593Smuzhiyun {
773*4882a593Smuzhiyun int need_software_tstamp = sock_flag(sk, SOCK_RCVTSTAMP);
774*4882a593Smuzhiyun int new_tstamp = sock_flag(sk, SOCK_TSTAMP_NEW);
775*4882a593Smuzhiyun struct scm_timestamping_internal tss;
776*4882a593Smuzhiyun
777*4882a593Smuzhiyun int empty = 1, false_tstamp = 0;
778*4882a593Smuzhiyun struct skb_shared_hwtstamps *shhwtstamps =
779*4882a593Smuzhiyun skb_hwtstamps(skb);
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun /* Race occurred between timestamp enabling and packet
782*4882a593Smuzhiyun receiving. Fill in the current time for now. */
783*4882a593Smuzhiyun if (need_software_tstamp && skb->tstamp == 0) {
784*4882a593Smuzhiyun __net_timestamp(skb);
785*4882a593Smuzhiyun false_tstamp = 1;
786*4882a593Smuzhiyun }
787*4882a593Smuzhiyun
788*4882a593Smuzhiyun if (need_software_tstamp) {
789*4882a593Smuzhiyun if (!sock_flag(sk, SOCK_RCVTSTAMPNS)) {
790*4882a593Smuzhiyun if (new_tstamp) {
791*4882a593Smuzhiyun struct __kernel_sock_timeval tv;
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun skb_get_new_timestamp(skb, &tv);
794*4882a593Smuzhiyun put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP_NEW,
795*4882a593Smuzhiyun sizeof(tv), &tv);
796*4882a593Smuzhiyun } else {
797*4882a593Smuzhiyun struct __kernel_old_timeval tv;
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun skb_get_timestamp(skb, &tv);
800*4882a593Smuzhiyun put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP_OLD,
801*4882a593Smuzhiyun sizeof(tv), &tv);
802*4882a593Smuzhiyun }
803*4882a593Smuzhiyun } else {
804*4882a593Smuzhiyun if (new_tstamp) {
805*4882a593Smuzhiyun struct __kernel_timespec ts;
806*4882a593Smuzhiyun
807*4882a593Smuzhiyun skb_get_new_timestampns(skb, &ts);
808*4882a593Smuzhiyun put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_NEW,
809*4882a593Smuzhiyun sizeof(ts), &ts);
810*4882a593Smuzhiyun } else {
811*4882a593Smuzhiyun struct __kernel_old_timespec ts;
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun skb_get_timestampns(skb, &ts);
814*4882a593Smuzhiyun put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_OLD,
815*4882a593Smuzhiyun sizeof(ts), &ts);
816*4882a593Smuzhiyun }
817*4882a593Smuzhiyun }
818*4882a593Smuzhiyun }
819*4882a593Smuzhiyun
820*4882a593Smuzhiyun memset(&tss, 0, sizeof(tss));
821*4882a593Smuzhiyun if ((sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE) &&
822*4882a593Smuzhiyun ktime_to_timespec64_cond(skb->tstamp, tss.ts + 0))
823*4882a593Smuzhiyun empty = 0;
824*4882a593Smuzhiyun if (shhwtstamps &&
825*4882a593Smuzhiyun (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
826*4882a593Smuzhiyun !skb_is_swtx_tstamp(skb, false_tstamp) &&
827*4882a593Smuzhiyun ktime_to_timespec64_cond(shhwtstamps->hwtstamp, tss.ts + 2)) {
828*4882a593Smuzhiyun empty = 0;
829*4882a593Smuzhiyun if ((sk->sk_tsflags & SOF_TIMESTAMPING_OPT_PKTINFO) &&
830*4882a593Smuzhiyun !skb_is_err_queue(skb))
831*4882a593Smuzhiyun put_ts_pktinfo(msg, skb);
832*4882a593Smuzhiyun }
833*4882a593Smuzhiyun if (!empty) {
834*4882a593Smuzhiyun if (sock_flag(sk, SOCK_TSTAMP_NEW))
835*4882a593Smuzhiyun put_cmsg_scm_timestamping64(msg, &tss);
836*4882a593Smuzhiyun else
837*4882a593Smuzhiyun put_cmsg_scm_timestamping(msg, &tss);
838*4882a593Smuzhiyun
839*4882a593Smuzhiyun if (skb_is_err_queue(skb) && skb->len &&
840*4882a593Smuzhiyun SKB_EXT_ERR(skb)->opt_stats)
841*4882a593Smuzhiyun put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPING_OPT_STATS,
842*4882a593Smuzhiyun skb->len, skb->data);
843*4882a593Smuzhiyun }
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__sock_recv_timestamp);
846*4882a593Smuzhiyun
__sock_recv_wifi_status(struct msghdr * msg,struct sock * sk,struct sk_buff * skb)847*4882a593Smuzhiyun void __sock_recv_wifi_status(struct msghdr *msg, struct sock *sk,
848*4882a593Smuzhiyun struct sk_buff *skb)
849*4882a593Smuzhiyun {
850*4882a593Smuzhiyun int ack;
851*4882a593Smuzhiyun
852*4882a593Smuzhiyun if (!sock_flag(sk, SOCK_WIFI_STATUS))
853*4882a593Smuzhiyun return;
854*4882a593Smuzhiyun if (!skb->wifi_acked_valid)
855*4882a593Smuzhiyun return;
856*4882a593Smuzhiyun
857*4882a593Smuzhiyun ack = skb->wifi_acked;
858*4882a593Smuzhiyun
859*4882a593Smuzhiyun put_cmsg(msg, SOL_SOCKET, SCM_WIFI_STATUS, sizeof(ack), &ack);
860*4882a593Smuzhiyun }
861*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__sock_recv_wifi_status);
862*4882a593Smuzhiyun
sock_recv_drops(struct msghdr * msg,struct sock * sk,struct sk_buff * skb)863*4882a593Smuzhiyun static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
864*4882a593Smuzhiyun struct sk_buff *skb)
865*4882a593Smuzhiyun {
866*4882a593Smuzhiyun if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && SOCK_SKB_CB(skb)->dropcount)
867*4882a593Smuzhiyun put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL,
868*4882a593Smuzhiyun sizeof(__u32), &SOCK_SKB_CB(skb)->dropcount);
869*4882a593Smuzhiyun }
870*4882a593Smuzhiyun
__sock_recv_ts_and_drops(struct msghdr * msg,struct sock * sk,struct sk_buff * skb)871*4882a593Smuzhiyun void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
872*4882a593Smuzhiyun struct sk_buff *skb)
873*4882a593Smuzhiyun {
874*4882a593Smuzhiyun sock_recv_timestamp(msg, sk, skb);
875*4882a593Smuzhiyun sock_recv_drops(msg, sk, skb);
876*4882a593Smuzhiyun }
877*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun INDIRECT_CALLABLE_DECLARE(int inet_recvmsg(struct socket *, struct msghdr *,
880*4882a593Smuzhiyun size_t, int));
881*4882a593Smuzhiyun INDIRECT_CALLABLE_DECLARE(int inet6_recvmsg(struct socket *, struct msghdr *,
882*4882a593Smuzhiyun size_t, int));
sock_recvmsg_nosec(struct socket * sock,struct msghdr * msg,int flags)883*4882a593Smuzhiyun static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
884*4882a593Smuzhiyun int flags)
885*4882a593Smuzhiyun {
886*4882a593Smuzhiyun return INDIRECT_CALL_INET(sock->ops->recvmsg, inet6_recvmsg,
887*4882a593Smuzhiyun inet_recvmsg, sock, msg, msg_data_left(msg),
888*4882a593Smuzhiyun flags);
889*4882a593Smuzhiyun }
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun /**
892*4882a593Smuzhiyun * sock_recvmsg - receive a message from @sock
893*4882a593Smuzhiyun * @sock: socket
894*4882a593Smuzhiyun * @msg: message to receive
895*4882a593Smuzhiyun * @flags: message flags
896*4882a593Smuzhiyun *
897*4882a593Smuzhiyun * Receives @msg from @sock, passing through LSM. Returns the total number
898*4882a593Smuzhiyun * of bytes received, or an error.
899*4882a593Smuzhiyun */
sock_recvmsg(struct socket * sock,struct msghdr * msg,int flags)900*4882a593Smuzhiyun int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags)
901*4882a593Smuzhiyun {
902*4882a593Smuzhiyun int err = security_socket_recvmsg(sock, msg, msg_data_left(msg), flags);
903*4882a593Smuzhiyun
904*4882a593Smuzhiyun return err ?: sock_recvmsg_nosec(sock, msg, flags);
905*4882a593Smuzhiyun }
906*4882a593Smuzhiyun EXPORT_SYMBOL(sock_recvmsg);
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun /**
909*4882a593Smuzhiyun * kernel_recvmsg - Receive a message from a socket (kernel space)
910*4882a593Smuzhiyun * @sock: The socket to receive the message from
911*4882a593Smuzhiyun * @msg: Received message
912*4882a593Smuzhiyun * @vec: Input s/g array for message data
913*4882a593Smuzhiyun * @num: Size of input s/g array
914*4882a593Smuzhiyun * @size: Number of bytes to read
915*4882a593Smuzhiyun * @flags: Message flags (MSG_DONTWAIT, etc...)
916*4882a593Smuzhiyun *
917*4882a593Smuzhiyun * On return the msg structure contains the scatter/gather array passed in the
918*4882a593Smuzhiyun * vec argument. The array is modified so that it consists of the unfilled
919*4882a593Smuzhiyun * portion of the original array.
920*4882a593Smuzhiyun *
921*4882a593Smuzhiyun * The returned value is the total number of bytes received, or an error.
922*4882a593Smuzhiyun */
923*4882a593Smuzhiyun
kernel_recvmsg(struct socket * sock,struct msghdr * msg,struct kvec * vec,size_t num,size_t size,int flags)924*4882a593Smuzhiyun int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
925*4882a593Smuzhiyun struct kvec *vec, size_t num, size_t size, int flags)
926*4882a593Smuzhiyun {
927*4882a593Smuzhiyun msg->msg_control_is_user = false;
928*4882a593Smuzhiyun iov_iter_kvec(&msg->msg_iter, READ, vec, num, size);
929*4882a593Smuzhiyun return sock_recvmsg(sock, msg, flags);
930*4882a593Smuzhiyun }
931*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_recvmsg);
932*4882a593Smuzhiyun
sock_sendpage(struct file * file,struct page * page,int offset,size_t size,loff_t * ppos,int more)933*4882a593Smuzhiyun static ssize_t sock_sendpage(struct file *file, struct page *page,
934*4882a593Smuzhiyun int offset, size_t size, loff_t *ppos, int more)
935*4882a593Smuzhiyun {
936*4882a593Smuzhiyun struct socket *sock;
937*4882a593Smuzhiyun int flags;
938*4882a593Smuzhiyun
939*4882a593Smuzhiyun sock = file->private_data;
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
942*4882a593Smuzhiyun /* more is a combination of MSG_MORE and MSG_SENDPAGE_NOTLAST */
943*4882a593Smuzhiyun flags |= more;
944*4882a593Smuzhiyun
945*4882a593Smuzhiyun return kernel_sendpage(sock, page, offset, size, flags);
946*4882a593Smuzhiyun }
947*4882a593Smuzhiyun
sock_splice_read(struct file * file,loff_t * ppos,struct pipe_inode_info * pipe,size_t len,unsigned int flags)948*4882a593Smuzhiyun static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
949*4882a593Smuzhiyun struct pipe_inode_info *pipe, size_t len,
950*4882a593Smuzhiyun unsigned int flags)
951*4882a593Smuzhiyun {
952*4882a593Smuzhiyun struct socket *sock = file->private_data;
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun if (unlikely(!sock->ops->splice_read))
955*4882a593Smuzhiyun return generic_file_splice_read(file, ppos, pipe, len, flags);
956*4882a593Smuzhiyun
957*4882a593Smuzhiyun return sock->ops->splice_read(sock, ppos, pipe, len, flags);
958*4882a593Smuzhiyun }
959*4882a593Smuzhiyun
sock_read_iter(struct kiocb * iocb,struct iov_iter * to)960*4882a593Smuzhiyun static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to)
961*4882a593Smuzhiyun {
962*4882a593Smuzhiyun struct file *file = iocb->ki_filp;
963*4882a593Smuzhiyun struct socket *sock = file->private_data;
964*4882a593Smuzhiyun struct msghdr msg = {.msg_iter = *to,
965*4882a593Smuzhiyun .msg_iocb = iocb};
966*4882a593Smuzhiyun ssize_t res;
967*4882a593Smuzhiyun
968*4882a593Smuzhiyun if (file->f_flags & O_NONBLOCK || (iocb->ki_flags & IOCB_NOWAIT))
969*4882a593Smuzhiyun msg.msg_flags = MSG_DONTWAIT;
970*4882a593Smuzhiyun
971*4882a593Smuzhiyun if (iocb->ki_pos != 0)
972*4882a593Smuzhiyun return -ESPIPE;
973*4882a593Smuzhiyun
974*4882a593Smuzhiyun if (!iov_iter_count(to)) /* Match SYS5 behaviour */
975*4882a593Smuzhiyun return 0;
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun res = sock_recvmsg(sock, &msg, msg.msg_flags);
978*4882a593Smuzhiyun *to = msg.msg_iter;
979*4882a593Smuzhiyun return res;
980*4882a593Smuzhiyun }
981*4882a593Smuzhiyun
sock_write_iter(struct kiocb * iocb,struct iov_iter * from)982*4882a593Smuzhiyun static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from)
983*4882a593Smuzhiyun {
984*4882a593Smuzhiyun struct file *file = iocb->ki_filp;
985*4882a593Smuzhiyun struct socket *sock = file->private_data;
986*4882a593Smuzhiyun struct msghdr msg = {.msg_iter = *from,
987*4882a593Smuzhiyun .msg_iocb = iocb};
988*4882a593Smuzhiyun ssize_t res;
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun if (iocb->ki_pos != 0)
991*4882a593Smuzhiyun return -ESPIPE;
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun if (file->f_flags & O_NONBLOCK || (iocb->ki_flags & IOCB_NOWAIT))
994*4882a593Smuzhiyun msg.msg_flags = MSG_DONTWAIT;
995*4882a593Smuzhiyun
996*4882a593Smuzhiyun if (sock->type == SOCK_SEQPACKET)
997*4882a593Smuzhiyun msg.msg_flags |= MSG_EOR;
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun res = sock_sendmsg(sock, &msg);
1000*4882a593Smuzhiyun *from = msg.msg_iter;
1001*4882a593Smuzhiyun return res;
1002*4882a593Smuzhiyun }
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun /*
1005*4882a593Smuzhiyun * Atomic setting of ioctl hooks to avoid race
1006*4882a593Smuzhiyun * with module unload.
1007*4882a593Smuzhiyun */
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun static DEFINE_MUTEX(br_ioctl_mutex);
1010*4882a593Smuzhiyun static int (*br_ioctl_hook) (struct net *, unsigned int cmd, void __user *arg);
1011*4882a593Smuzhiyun
brioctl_set(int (* hook)(struct net *,unsigned int,void __user *))1012*4882a593Smuzhiyun void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *))
1013*4882a593Smuzhiyun {
1014*4882a593Smuzhiyun mutex_lock(&br_ioctl_mutex);
1015*4882a593Smuzhiyun br_ioctl_hook = hook;
1016*4882a593Smuzhiyun mutex_unlock(&br_ioctl_mutex);
1017*4882a593Smuzhiyun }
1018*4882a593Smuzhiyun EXPORT_SYMBOL(brioctl_set);
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun static DEFINE_MUTEX(vlan_ioctl_mutex);
1021*4882a593Smuzhiyun static int (*vlan_ioctl_hook) (struct net *, void __user *arg);
1022*4882a593Smuzhiyun
vlan_ioctl_set(int (* hook)(struct net *,void __user *))1023*4882a593Smuzhiyun void vlan_ioctl_set(int (*hook) (struct net *, void __user *))
1024*4882a593Smuzhiyun {
1025*4882a593Smuzhiyun mutex_lock(&vlan_ioctl_mutex);
1026*4882a593Smuzhiyun vlan_ioctl_hook = hook;
1027*4882a593Smuzhiyun mutex_unlock(&vlan_ioctl_mutex);
1028*4882a593Smuzhiyun }
1029*4882a593Smuzhiyun EXPORT_SYMBOL(vlan_ioctl_set);
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun static DEFINE_MUTEX(dlci_ioctl_mutex);
1032*4882a593Smuzhiyun static int (*dlci_ioctl_hook) (unsigned int, void __user *);
1033*4882a593Smuzhiyun
dlci_ioctl_set(int (* hook)(unsigned int,void __user *))1034*4882a593Smuzhiyun void dlci_ioctl_set(int (*hook) (unsigned int, void __user *))
1035*4882a593Smuzhiyun {
1036*4882a593Smuzhiyun mutex_lock(&dlci_ioctl_mutex);
1037*4882a593Smuzhiyun dlci_ioctl_hook = hook;
1038*4882a593Smuzhiyun mutex_unlock(&dlci_ioctl_mutex);
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun EXPORT_SYMBOL(dlci_ioctl_set);
1041*4882a593Smuzhiyun
sock_do_ioctl(struct net * net,struct socket * sock,unsigned int cmd,unsigned long arg)1042*4882a593Smuzhiyun static long sock_do_ioctl(struct net *net, struct socket *sock,
1043*4882a593Smuzhiyun unsigned int cmd, unsigned long arg)
1044*4882a593Smuzhiyun {
1045*4882a593Smuzhiyun int err;
1046*4882a593Smuzhiyun void __user *argp = (void __user *)arg;
1047*4882a593Smuzhiyun
1048*4882a593Smuzhiyun err = sock->ops->ioctl(sock, cmd, arg);
1049*4882a593Smuzhiyun
1050*4882a593Smuzhiyun /*
1051*4882a593Smuzhiyun * If this ioctl is unknown try to hand it down
1052*4882a593Smuzhiyun * to the NIC driver.
1053*4882a593Smuzhiyun */
1054*4882a593Smuzhiyun if (err != -ENOIOCTLCMD)
1055*4882a593Smuzhiyun return err;
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun if (cmd == SIOCGIFCONF) {
1058*4882a593Smuzhiyun struct ifconf ifc;
1059*4882a593Smuzhiyun if (copy_from_user(&ifc, argp, sizeof(struct ifconf)))
1060*4882a593Smuzhiyun return -EFAULT;
1061*4882a593Smuzhiyun rtnl_lock();
1062*4882a593Smuzhiyun err = dev_ifconf(net, &ifc, sizeof(struct ifreq));
1063*4882a593Smuzhiyun rtnl_unlock();
1064*4882a593Smuzhiyun if (!err && copy_to_user(argp, &ifc, sizeof(struct ifconf)))
1065*4882a593Smuzhiyun err = -EFAULT;
1066*4882a593Smuzhiyun } else if (is_socket_ioctl_cmd(cmd)) {
1067*4882a593Smuzhiyun struct ifreq ifr;
1068*4882a593Smuzhiyun bool need_copyout;
1069*4882a593Smuzhiyun if (copy_from_user(&ifr, argp, sizeof(struct ifreq)))
1070*4882a593Smuzhiyun return -EFAULT;
1071*4882a593Smuzhiyun err = dev_ioctl(net, cmd, &ifr, &need_copyout);
1072*4882a593Smuzhiyun if (!err && need_copyout)
1073*4882a593Smuzhiyun if (copy_to_user(argp, &ifr, sizeof(struct ifreq)))
1074*4882a593Smuzhiyun return -EFAULT;
1075*4882a593Smuzhiyun } else {
1076*4882a593Smuzhiyun err = -ENOTTY;
1077*4882a593Smuzhiyun }
1078*4882a593Smuzhiyun return err;
1079*4882a593Smuzhiyun }
1080*4882a593Smuzhiyun
1081*4882a593Smuzhiyun /*
1082*4882a593Smuzhiyun * With an ioctl, arg may well be a user mode pointer, but we don't know
1083*4882a593Smuzhiyun * what to do with it - that's up to the protocol still.
1084*4882a593Smuzhiyun */
1085*4882a593Smuzhiyun
sock_ioctl(struct file * file,unsigned cmd,unsigned long arg)1086*4882a593Smuzhiyun static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
1087*4882a593Smuzhiyun {
1088*4882a593Smuzhiyun struct socket *sock;
1089*4882a593Smuzhiyun struct sock *sk;
1090*4882a593Smuzhiyun void __user *argp = (void __user *)arg;
1091*4882a593Smuzhiyun int pid, err;
1092*4882a593Smuzhiyun struct net *net;
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun sock = file->private_data;
1095*4882a593Smuzhiyun sk = sock->sk;
1096*4882a593Smuzhiyun net = sock_net(sk);
1097*4882a593Smuzhiyun if (unlikely(cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15))) {
1098*4882a593Smuzhiyun struct ifreq ifr;
1099*4882a593Smuzhiyun bool need_copyout;
1100*4882a593Smuzhiyun if (copy_from_user(&ifr, argp, sizeof(struct ifreq)))
1101*4882a593Smuzhiyun return -EFAULT;
1102*4882a593Smuzhiyun err = dev_ioctl(net, cmd, &ifr, &need_copyout);
1103*4882a593Smuzhiyun if (!err && need_copyout)
1104*4882a593Smuzhiyun if (copy_to_user(argp, &ifr, sizeof(struct ifreq)))
1105*4882a593Smuzhiyun return -EFAULT;
1106*4882a593Smuzhiyun } else
1107*4882a593Smuzhiyun #ifdef CONFIG_WEXT_CORE
1108*4882a593Smuzhiyun if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
1109*4882a593Smuzhiyun err = wext_handle_ioctl(net, cmd, argp);
1110*4882a593Smuzhiyun } else
1111*4882a593Smuzhiyun #endif
1112*4882a593Smuzhiyun switch (cmd) {
1113*4882a593Smuzhiyun case FIOSETOWN:
1114*4882a593Smuzhiyun case SIOCSPGRP:
1115*4882a593Smuzhiyun err = -EFAULT;
1116*4882a593Smuzhiyun if (get_user(pid, (int __user *)argp))
1117*4882a593Smuzhiyun break;
1118*4882a593Smuzhiyun err = f_setown(sock->file, pid, 1);
1119*4882a593Smuzhiyun break;
1120*4882a593Smuzhiyun case FIOGETOWN:
1121*4882a593Smuzhiyun case SIOCGPGRP:
1122*4882a593Smuzhiyun err = put_user(f_getown(sock->file),
1123*4882a593Smuzhiyun (int __user *)argp);
1124*4882a593Smuzhiyun break;
1125*4882a593Smuzhiyun case SIOCGIFBR:
1126*4882a593Smuzhiyun case SIOCSIFBR:
1127*4882a593Smuzhiyun case SIOCBRADDBR:
1128*4882a593Smuzhiyun case SIOCBRDELBR:
1129*4882a593Smuzhiyun err = -ENOPKG;
1130*4882a593Smuzhiyun if (!br_ioctl_hook)
1131*4882a593Smuzhiyun request_module("bridge");
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun mutex_lock(&br_ioctl_mutex);
1134*4882a593Smuzhiyun if (br_ioctl_hook)
1135*4882a593Smuzhiyun err = br_ioctl_hook(net, cmd, argp);
1136*4882a593Smuzhiyun mutex_unlock(&br_ioctl_mutex);
1137*4882a593Smuzhiyun break;
1138*4882a593Smuzhiyun case SIOCGIFVLAN:
1139*4882a593Smuzhiyun case SIOCSIFVLAN:
1140*4882a593Smuzhiyun err = -ENOPKG;
1141*4882a593Smuzhiyun if (!vlan_ioctl_hook)
1142*4882a593Smuzhiyun request_module("8021q");
1143*4882a593Smuzhiyun
1144*4882a593Smuzhiyun mutex_lock(&vlan_ioctl_mutex);
1145*4882a593Smuzhiyun if (vlan_ioctl_hook)
1146*4882a593Smuzhiyun err = vlan_ioctl_hook(net, argp);
1147*4882a593Smuzhiyun mutex_unlock(&vlan_ioctl_mutex);
1148*4882a593Smuzhiyun break;
1149*4882a593Smuzhiyun case SIOCADDDLCI:
1150*4882a593Smuzhiyun case SIOCDELDLCI:
1151*4882a593Smuzhiyun err = -ENOPKG;
1152*4882a593Smuzhiyun if (!dlci_ioctl_hook)
1153*4882a593Smuzhiyun request_module("dlci");
1154*4882a593Smuzhiyun
1155*4882a593Smuzhiyun mutex_lock(&dlci_ioctl_mutex);
1156*4882a593Smuzhiyun if (dlci_ioctl_hook)
1157*4882a593Smuzhiyun err = dlci_ioctl_hook(cmd, argp);
1158*4882a593Smuzhiyun mutex_unlock(&dlci_ioctl_mutex);
1159*4882a593Smuzhiyun break;
1160*4882a593Smuzhiyun case SIOCGSKNS:
1161*4882a593Smuzhiyun err = -EPERM;
1162*4882a593Smuzhiyun if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1163*4882a593Smuzhiyun break;
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun err = open_related_ns(&net->ns, get_net_ns);
1166*4882a593Smuzhiyun break;
1167*4882a593Smuzhiyun case SIOCGSTAMP_OLD:
1168*4882a593Smuzhiyun case SIOCGSTAMPNS_OLD:
1169*4882a593Smuzhiyun if (!sock->ops->gettstamp) {
1170*4882a593Smuzhiyun err = -ENOIOCTLCMD;
1171*4882a593Smuzhiyun break;
1172*4882a593Smuzhiyun }
1173*4882a593Smuzhiyun err = sock->ops->gettstamp(sock, argp,
1174*4882a593Smuzhiyun cmd == SIOCGSTAMP_OLD,
1175*4882a593Smuzhiyun !IS_ENABLED(CONFIG_64BIT));
1176*4882a593Smuzhiyun break;
1177*4882a593Smuzhiyun case SIOCGSTAMP_NEW:
1178*4882a593Smuzhiyun case SIOCGSTAMPNS_NEW:
1179*4882a593Smuzhiyun if (!sock->ops->gettstamp) {
1180*4882a593Smuzhiyun err = -ENOIOCTLCMD;
1181*4882a593Smuzhiyun break;
1182*4882a593Smuzhiyun }
1183*4882a593Smuzhiyun err = sock->ops->gettstamp(sock, argp,
1184*4882a593Smuzhiyun cmd == SIOCGSTAMP_NEW,
1185*4882a593Smuzhiyun false);
1186*4882a593Smuzhiyun break;
1187*4882a593Smuzhiyun default:
1188*4882a593Smuzhiyun err = sock_do_ioctl(net, sock, cmd, arg);
1189*4882a593Smuzhiyun break;
1190*4882a593Smuzhiyun }
1191*4882a593Smuzhiyun return err;
1192*4882a593Smuzhiyun }
1193*4882a593Smuzhiyun
1194*4882a593Smuzhiyun /**
1195*4882a593Smuzhiyun * sock_create_lite - creates a socket
1196*4882a593Smuzhiyun * @family: protocol family (AF_INET, ...)
1197*4882a593Smuzhiyun * @type: communication type (SOCK_STREAM, ...)
1198*4882a593Smuzhiyun * @protocol: protocol (0, ...)
1199*4882a593Smuzhiyun * @res: new socket
1200*4882a593Smuzhiyun *
1201*4882a593Smuzhiyun * Creates a new socket and assigns it to @res, passing through LSM.
1202*4882a593Smuzhiyun * The new socket initialization is not complete, see kernel_accept().
1203*4882a593Smuzhiyun * Returns 0 or an error. On failure @res is set to %NULL.
1204*4882a593Smuzhiyun * This function internally uses GFP_KERNEL.
1205*4882a593Smuzhiyun */
1206*4882a593Smuzhiyun
sock_create_lite(int family,int type,int protocol,struct socket ** res)1207*4882a593Smuzhiyun int sock_create_lite(int family, int type, int protocol, struct socket **res)
1208*4882a593Smuzhiyun {
1209*4882a593Smuzhiyun int err;
1210*4882a593Smuzhiyun struct socket *sock = NULL;
1211*4882a593Smuzhiyun
1212*4882a593Smuzhiyun err = security_socket_create(family, type, protocol, 1);
1213*4882a593Smuzhiyun if (err)
1214*4882a593Smuzhiyun goto out;
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun sock = sock_alloc();
1217*4882a593Smuzhiyun if (!sock) {
1218*4882a593Smuzhiyun err = -ENOMEM;
1219*4882a593Smuzhiyun goto out;
1220*4882a593Smuzhiyun }
1221*4882a593Smuzhiyun
1222*4882a593Smuzhiyun sock->type = type;
1223*4882a593Smuzhiyun err = security_socket_post_create(sock, family, type, protocol, 1);
1224*4882a593Smuzhiyun if (err)
1225*4882a593Smuzhiyun goto out_release;
1226*4882a593Smuzhiyun
1227*4882a593Smuzhiyun out:
1228*4882a593Smuzhiyun *res = sock;
1229*4882a593Smuzhiyun return err;
1230*4882a593Smuzhiyun out_release:
1231*4882a593Smuzhiyun sock_release(sock);
1232*4882a593Smuzhiyun sock = NULL;
1233*4882a593Smuzhiyun goto out;
1234*4882a593Smuzhiyun }
1235*4882a593Smuzhiyun EXPORT_SYMBOL(sock_create_lite);
1236*4882a593Smuzhiyun
1237*4882a593Smuzhiyun /* No kernel lock held - perfect */
sock_poll(struct file * file,poll_table * wait)1238*4882a593Smuzhiyun static __poll_t sock_poll(struct file *file, poll_table *wait)
1239*4882a593Smuzhiyun {
1240*4882a593Smuzhiyun struct socket *sock = file->private_data;
1241*4882a593Smuzhiyun __poll_t events = poll_requested_events(wait), flag = 0;
1242*4882a593Smuzhiyun
1243*4882a593Smuzhiyun if (!sock->ops->poll)
1244*4882a593Smuzhiyun return 0;
1245*4882a593Smuzhiyun
1246*4882a593Smuzhiyun if (sk_can_busy_loop(sock->sk)) {
1247*4882a593Smuzhiyun /* poll once if requested by the syscall */
1248*4882a593Smuzhiyun if (events & POLL_BUSY_LOOP)
1249*4882a593Smuzhiyun sk_busy_loop(sock->sk, 1);
1250*4882a593Smuzhiyun
1251*4882a593Smuzhiyun /* if this socket can poll_ll, tell the system call */
1252*4882a593Smuzhiyun flag = POLL_BUSY_LOOP;
1253*4882a593Smuzhiyun }
1254*4882a593Smuzhiyun
1255*4882a593Smuzhiyun return sock->ops->poll(file, sock, wait) | flag;
1256*4882a593Smuzhiyun }
1257*4882a593Smuzhiyun
sock_mmap(struct file * file,struct vm_area_struct * vma)1258*4882a593Smuzhiyun static int sock_mmap(struct file *file, struct vm_area_struct *vma)
1259*4882a593Smuzhiyun {
1260*4882a593Smuzhiyun struct socket *sock = file->private_data;
1261*4882a593Smuzhiyun
1262*4882a593Smuzhiyun return sock->ops->mmap(file, sock, vma);
1263*4882a593Smuzhiyun }
1264*4882a593Smuzhiyun
sock_close(struct inode * inode,struct file * filp)1265*4882a593Smuzhiyun static int sock_close(struct inode *inode, struct file *filp)
1266*4882a593Smuzhiyun {
1267*4882a593Smuzhiyun __sock_release(SOCKET_I(inode), inode);
1268*4882a593Smuzhiyun return 0;
1269*4882a593Smuzhiyun }
1270*4882a593Smuzhiyun
1271*4882a593Smuzhiyun /*
1272*4882a593Smuzhiyun * Update the socket async list
1273*4882a593Smuzhiyun *
1274*4882a593Smuzhiyun * Fasync_list locking strategy.
1275*4882a593Smuzhiyun *
1276*4882a593Smuzhiyun * 1. fasync_list is modified only under process context socket lock
1277*4882a593Smuzhiyun * i.e. under semaphore.
1278*4882a593Smuzhiyun * 2. fasync_list is used under read_lock(&sk->sk_callback_lock)
1279*4882a593Smuzhiyun * or under socket lock
1280*4882a593Smuzhiyun */
1281*4882a593Smuzhiyun
sock_fasync(int fd,struct file * filp,int on)1282*4882a593Smuzhiyun static int sock_fasync(int fd, struct file *filp, int on)
1283*4882a593Smuzhiyun {
1284*4882a593Smuzhiyun struct socket *sock = filp->private_data;
1285*4882a593Smuzhiyun struct sock *sk = sock->sk;
1286*4882a593Smuzhiyun struct socket_wq *wq = &sock->wq;
1287*4882a593Smuzhiyun
1288*4882a593Smuzhiyun if (sk == NULL)
1289*4882a593Smuzhiyun return -EINVAL;
1290*4882a593Smuzhiyun
1291*4882a593Smuzhiyun lock_sock(sk);
1292*4882a593Smuzhiyun fasync_helper(fd, filp, on, &wq->fasync_list);
1293*4882a593Smuzhiyun
1294*4882a593Smuzhiyun if (!wq->fasync_list)
1295*4882a593Smuzhiyun sock_reset_flag(sk, SOCK_FASYNC);
1296*4882a593Smuzhiyun else
1297*4882a593Smuzhiyun sock_set_flag(sk, SOCK_FASYNC);
1298*4882a593Smuzhiyun
1299*4882a593Smuzhiyun release_sock(sk);
1300*4882a593Smuzhiyun return 0;
1301*4882a593Smuzhiyun }
1302*4882a593Smuzhiyun
1303*4882a593Smuzhiyun /* This function may be called only under rcu_lock */
1304*4882a593Smuzhiyun
sock_wake_async(struct socket_wq * wq,int how,int band)1305*4882a593Smuzhiyun int sock_wake_async(struct socket_wq *wq, int how, int band)
1306*4882a593Smuzhiyun {
1307*4882a593Smuzhiyun if (!wq || !wq->fasync_list)
1308*4882a593Smuzhiyun return -1;
1309*4882a593Smuzhiyun
1310*4882a593Smuzhiyun switch (how) {
1311*4882a593Smuzhiyun case SOCK_WAKE_WAITD:
1312*4882a593Smuzhiyun if (test_bit(SOCKWQ_ASYNC_WAITDATA, &wq->flags))
1313*4882a593Smuzhiyun break;
1314*4882a593Smuzhiyun goto call_kill;
1315*4882a593Smuzhiyun case SOCK_WAKE_SPACE:
1316*4882a593Smuzhiyun if (!test_and_clear_bit(SOCKWQ_ASYNC_NOSPACE, &wq->flags))
1317*4882a593Smuzhiyun break;
1318*4882a593Smuzhiyun fallthrough;
1319*4882a593Smuzhiyun case SOCK_WAKE_IO:
1320*4882a593Smuzhiyun call_kill:
1321*4882a593Smuzhiyun kill_fasync(&wq->fasync_list, SIGIO, band);
1322*4882a593Smuzhiyun break;
1323*4882a593Smuzhiyun case SOCK_WAKE_URG:
1324*4882a593Smuzhiyun kill_fasync(&wq->fasync_list, SIGURG, band);
1325*4882a593Smuzhiyun }
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun return 0;
1328*4882a593Smuzhiyun }
1329*4882a593Smuzhiyun EXPORT_SYMBOL(sock_wake_async);
1330*4882a593Smuzhiyun
1331*4882a593Smuzhiyun /**
1332*4882a593Smuzhiyun * __sock_create - creates a socket
1333*4882a593Smuzhiyun * @net: net namespace
1334*4882a593Smuzhiyun * @family: protocol family (AF_INET, ...)
1335*4882a593Smuzhiyun * @type: communication type (SOCK_STREAM, ...)
1336*4882a593Smuzhiyun * @protocol: protocol (0, ...)
1337*4882a593Smuzhiyun * @res: new socket
1338*4882a593Smuzhiyun * @kern: boolean for kernel space sockets
1339*4882a593Smuzhiyun *
1340*4882a593Smuzhiyun * Creates a new socket and assigns it to @res, passing through LSM.
1341*4882a593Smuzhiyun * Returns 0 or an error. On failure @res is set to %NULL. @kern must
1342*4882a593Smuzhiyun * be set to true if the socket resides in kernel space.
1343*4882a593Smuzhiyun * This function internally uses GFP_KERNEL.
1344*4882a593Smuzhiyun */
1345*4882a593Smuzhiyun
__sock_create(struct net * net,int family,int type,int protocol,struct socket ** res,int kern)1346*4882a593Smuzhiyun int __sock_create(struct net *net, int family, int type, int protocol,
1347*4882a593Smuzhiyun struct socket **res, int kern)
1348*4882a593Smuzhiyun {
1349*4882a593Smuzhiyun int err;
1350*4882a593Smuzhiyun struct socket *sock;
1351*4882a593Smuzhiyun const struct net_proto_family *pf;
1352*4882a593Smuzhiyun
1353*4882a593Smuzhiyun /*
1354*4882a593Smuzhiyun * Check protocol is in range
1355*4882a593Smuzhiyun */
1356*4882a593Smuzhiyun if (family < 0 || family >= NPROTO)
1357*4882a593Smuzhiyun return -EAFNOSUPPORT;
1358*4882a593Smuzhiyun if (type < 0 || type >= SOCK_MAX)
1359*4882a593Smuzhiyun return -EINVAL;
1360*4882a593Smuzhiyun
1361*4882a593Smuzhiyun /* Compatibility.
1362*4882a593Smuzhiyun
1363*4882a593Smuzhiyun This uglymoron is moved from INET layer to here to avoid
1364*4882a593Smuzhiyun deadlock in module load.
1365*4882a593Smuzhiyun */
1366*4882a593Smuzhiyun if (family == PF_INET && type == SOCK_PACKET) {
1367*4882a593Smuzhiyun pr_info_once("%s uses obsolete (PF_INET,SOCK_PACKET)\n",
1368*4882a593Smuzhiyun current->comm);
1369*4882a593Smuzhiyun family = PF_PACKET;
1370*4882a593Smuzhiyun }
1371*4882a593Smuzhiyun
1372*4882a593Smuzhiyun err = security_socket_create(family, type, protocol, kern);
1373*4882a593Smuzhiyun if (err)
1374*4882a593Smuzhiyun return err;
1375*4882a593Smuzhiyun
1376*4882a593Smuzhiyun /*
1377*4882a593Smuzhiyun * Allocate the socket and allow the family to set things up. if
1378*4882a593Smuzhiyun * the protocol is 0, the family is instructed to select an appropriate
1379*4882a593Smuzhiyun * default.
1380*4882a593Smuzhiyun */
1381*4882a593Smuzhiyun sock = sock_alloc();
1382*4882a593Smuzhiyun if (!sock) {
1383*4882a593Smuzhiyun net_warn_ratelimited("socket: no more sockets\n");
1384*4882a593Smuzhiyun return -ENFILE; /* Not exactly a match, but its the
1385*4882a593Smuzhiyun closest posix thing */
1386*4882a593Smuzhiyun }
1387*4882a593Smuzhiyun
1388*4882a593Smuzhiyun sock->type = type;
1389*4882a593Smuzhiyun
1390*4882a593Smuzhiyun #ifdef CONFIG_MODULES
1391*4882a593Smuzhiyun /* Attempt to load a protocol module if the find failed.
1392*4882a593Smuzhiyun *
1393*4882a593Smuzhiyun * 12/09/1996 Marcin: But! this makes REALLY only sense, if the user
1394*4882a593Smuzhiyun * requested real, full-featured networking support upon configuration.
1395*4882a593Smuzhiyun * Otherwise module support will break!
1396*4882a593Smuzhiyun */
1397*4882a593Smuzhiyun if (rcu_access_pointer(net_families[family]) == NULL)
1398*4882a593Smuzhiyun request_module("net-pf-%d", family);
1399*4882a593Smuzhiyun #endif
1400*4882a593Smuzhiyun
1401*4882a593Smuzhiyun rcu_read_lock();
1402*4882a593Smuzhiyun pf = rcu_dereference(net_families[family]);
1403*4882a593Smuzhiyun err = -EAFNOSUPPORT;
1404*4882a593Smuzhiyun if (!pf)
1405*4882a593Smuzhiyun goto out_release;
1406*4882a593Smuzhiyun
1407*4882a593Smuzhiyun /*
1408*4882a593Smuzhiyun * We will call the ->create function, that possibly is in a loadable
1409*4882a593Smuzhiyun * module, so we have to bump that loadable module refcnt first.
1410*4882a593Smuzhiyun */
1411*4882a593Smuzhiyun if (!try_module_get(pf->owner))
1412*4882a593Smuzhiyun goto out_release;
1413*4882a593Smuzhiyun
1414*4882a593Smuzhiyun /* Now protected by module ref count */
1415*4882a593Smuzhiyun rcu_read_unlock();
1416*4882a593Smuzhiyun
1417*4882a593Smuzhiyun err = pf->create(net, sock, protocol, kern);
1418*4882a593Smuzhiyun if (err < 0)
1419*4882a593Smuzhiyun goto out_module_put;
1420*4882a593Smuzhiyun
1421*4882a593Smuzhiyun /*
1422*4882a593Smuzhiyun * Now to bump the refcnt of the [loadable] module that owns this
1423*4882a593Smuzhiyun * socket at sock_release time we decrement its refcnt.
1424*4882a593Smuzhiyun */
1425*4882a593Smuzhiyun if (!try_module_get(sock->ops->owner))
1426*4882a593Smuzhiyun goto out_module_busy;
1427*4882a593Smuzhiyun
1428*4882a593Smuzhiyun /*
1429*4882a593Smuzhiyun * Now that we're done with the ->create function, the [loadable]
1430*4882a593Smuzhiyun * module can have its refcnt decremented
1431*4882a593Smuzhiyun */
1432*4882a593Smuzhiyun module_put(pf->owner);
1433*4882a593Smuzhiyun err = security_socket_post_create(sock, family, type, protocol, kern);
1434*4882a593Smuzhiyun if (err)
1435*4882a593Smuzhiyun goto out_sock_release;
1436*4882a593Smuzhiyun *res = sock;
1437*4882a593Smuzhiyun
1438*4882a593Smuzhiyun return 0;
1439*4882a593Smuzhiyun
1440*4882a593Smuzhiyun out_module_busy:
1441*4882a593Smuzhiyun err = -EAFNOSUPPORT;
1442*4882a593Smuzhiyun out_module_put:
1443*4882a593Smuzhiyun sock->ops = NULL;
1444*4882a593Smuzhiyun module_put(pf->owner);
1445*4882a593Smuzhiyun out_sock_release:
1446*4882a593Smuzhiyun sock_release(sock);
1447*4882a593Smuzhiyun return err;
1448*4882a593Smuzhiyun
1449*4882a593Smuzhiyun out_release:
1450*4882a593Smuzhiyun rcu_read_unlock();
1451*4882a593Smuzhiyun goto out_sock_release;
1452*4882a593Smuzhiyun }
1453*4882a593Smuzhiyun EXPORT_SYMBOL(__sock_create);
1454*4882a593Smuzhiyun
1455*4882a593Smuzhiyun /**
1456*4882a593Smuzhiyun * sock_create - creates a socket
1457*4882a593Smuzhiyun * @family: protocol family (AF_INET, ...)
1458*4882a593Smuzhiyun * @type: communication type (SOCK_STREAM, ...)
1459*4882a593Smuzhiyun * @protocol: protocol (0, ...)
1460*4882a593Smuzhiyun * @res: new socket
1461*4882a593Smuzhiyun *
1462*4882a593Smuzhiyun * A wrapper around __sock_create().
1463*4882a593Smuzhiyun * Returns 0 or an error. This function internally uses GFP_KERNEL.
1464*4882a593Smuzhiyun */
1465*4882a593Smuzhiyun
sock_create(int family,int type,int protocol,struct socket ** res)1466*4882a593Smuzhiyun int sock_create(int family, int type, int protocol, struct socket **res)
1467*4882a593Smuzhiyun {
1468*4882a593Smuzhiyun return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
1469*4882a593Smuzhiyun }
1470*4882a593Smuzhiyun EXPORT_SYMBOL(sock_create);
1471*4882a593Smuzhiyun
1472*4882a593Smuzhiyun /**
1473*4882a593Smuzhiyun * sock_create_kern - creates a socket (kernel space)
1474*4882a593Smuzhiyun * @net: net namespace
1475*4882a593Smuzhiyun * @family: protocol family (AF_INET, ...)
1476*4882a593Smuzhiyun * @type: communication type (SOCK_STREAM, ...)
1477*4882a593Smuzhiyun * @protocol: protocol (0, ...)
1478*4882a593Smuzhiyun * @res: new socket
1479*4882a593Smuzhiyun *
1480*4882a593Smuzhiyun * A wrapper around __sock_create().
1481*4882a593Smuzhiyun * Returns 0 or an error. This function internally uses GFP_KERNEL.
1482*4882a593Smuzhiyun */
1483*4882a593Smuzhiyun
sock_create_kern(struct net * net,int family,int type,int protocol,struct socket ** res)1484*4882a593Smuzhiyun int sock_create_kern(struct net *net, int family, int type, int protocol, struct socket **res)
1485*4882a593Smuzhiyun {
1486*4882a593Smuzhiyun return __sock_create(net, family, type, protocol, res, 1);
1487*4882a593Smuzhiyun }
1488*4882a593Smuzhiyun EXPORT_SYMBOL(sock_create_kern);
1489*4882a593Smuzhiyun
__sys_socket(int family,int type,int protocol)1490*4882a593Smuzhiyun int __sys_socket(int family, int type, int protocol)
1491*4882a593Smuzhiyun {
1492*4882a593Smuzhiyun int retval;
1493*4882a593Smuzhiyun struct socket *sock;
1494*4882a593Smuzhiyun int flags;
1495*4882a593Smuzhiyun
1496*4882a593Smuzhiyun /* Check the SOCK_* constants for consistency. */
1497*4882a593Smuzhiyun BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC);
1498*4882a593Smuzhiyun BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK);
1499*4882a593Smuzhiyun BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK);
1500*4882a593Smuzhiyun BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK);
1501*4882a593Smuzhiyun
1502*4882a593Smuzhiyun flags = type & ~SOCK_TYPE_MASK;
1503*4882a593Smuzhiyun if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1504*4882a593Smuzhiyun return -EINVAL;
1505*4882a593Smuzhiyun type &= SOCK_TYPE_MASK;
1506*4882a593Smuzhiyun
1507*4882a593Smuzhiyun if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1508*4882a593Smuzhiyun flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1509*4882a593Smuzhiyun
1510*4882a593Smuzhiyun retval = sock_create(family, type, protocol, &sock);
1511*4882a593Smuzhiyun if (retval < 0)
1512*4882a593Smuzhiyun return retval;
1513*4882a593Smuzhiyun
1514*4882a593Smuzhiyun return sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
1515*4882a593Smuzhiyun }
1516*4882a593Smuzhiyun
SYSCALL_DEFINE3(socket,int,family,int,type,int,protocol)1517*4882a593Smuzhiyun SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1518*4882a593Smuzhiyun {
1519*4882a593Smuzhiyun return __sys_socket(family, type, protocol);
1520*4882a593Smuzhiyun }
1521*4882a593Smuzhiyun
1522*4882a593Smuzhiyun /*
1523*4882a593Smuzhiyun * Create a pair of connected sockets.
1524*4882a593Smuzhiyun */
1525*4882a593Smuzhiyun
__sys_socketpair(int family,int type,int protocol,int __user * usockvec)1526*4882a593Smuzhiyun int __sys_socketpair(int family, int type, int protocol, int __user *usockvec)
1527*4882a593Smuzhiyun {
1528*4882a593Smuzhiyun struct socket *sock1, *sock2;
1529*4882a593Smuzhiyun int fd1, fd2, err;
1530*4882a593Smuzhiyun struct file *newfile1, *newfile2;
1531*4882a593Smuzhiyun int flags;
1532*4882a593Smuzhiyun
1533*4882a593Smuzhiyun flags = type & ~SOCK_TYPE_MASK;
1534*4882a593Smuzhiyun if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1535*4882a593Smuzhiyun return -EINVAL;
1536*4882a593Smuzhiyun type &= SOCK_TYPE_MASK;
1537*4882a593Smuzhiyun
1538*4882a593Smuzhiyun if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1539*4882a593Smuzhiyun flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1540*4882a593Smuzhiyun
1541*4882a593Smuzhiyun /*
1542*4882a593Smuzhiyun * reserve descriptors and make sure we won't fail
1543*4882a593Smuzhiyun * to return them to userland.
1544*4882a593Smuzhiyun */
1545*4882a593Smuzhiyun fd1 = get_unused_fd_flags(flags);
1546*4882a593Smuzhiyun if (unlikely(fd1 < 0))
1547*4882a593Smuzhiyun return fd1;
1548*4882a593Smuzhiyun
1549*4882a593Smuzhiyun fd2 = get_unused_fd_flags(flags);
1550*4882a593Smuzhiyun if (unlikely(fd2 < 0)) {
1551*4882a593Smuzhiyun put_unused_fd(fd1);
1552*4882a593Smuzhiyun return fd2;
1553*4882a593Smuzhiyun }
1554*4882a593Smuzhiyun
1555*4882a593Smuzhiyun err = put_user(fd1, &usockvec[0]);
1556*4882a593Smuzhiyun if (err)
1557*4882a593Smuzhiyun goto out;
1558*4882a593Smuzhiyun
1559*4882a593Smuzhiyun err = put_user(fd2, &usockvec[1]);
1560*4882a593Smuzhiyun if (err)
1561*4882a593Smuzhiyun goto out;
1562*4882a593Smuzhiyun
1563*4882a593Smuzhiyun /*
1564*4882a593Smuzhiyun * Obtain the first socket and check if the underlying protocol
1565*4882a593Smuzhiyun * supports the socketpair call.
1566*4882a593Smuzhiyun */
1567*4882a593Smuzhiyun
1568*4882a593Smuzhiyun err = sock_create(family, type, protocol, &sock1);
1569*4882a593Smuzhiyun if (unlikely(err < 0))
1570*4882a593Smuzhiyun goto out;
1571*4882a593Smuzhiyun
1572*4882a593Smuzhiyun err = sock_create(family, type, protocol, &sock2);
1573*4882a593Smuzhiyun if (unlikely(err < 0)) {
1574*4882a593Smuzhiyun sock_release(sock1);
1575*4882a593Smuzhiyun goto out;
1576*4882a593Smuzhiyun }
1577*4882a593Smuzhiyun
1578*4882a593Smuzhiyun err = security_socket_socketpair(sock1, sock2);
1579*4882a593Smuzhiyun if (unlikely(err)) {
1580*4882a593Smuzhiyun sock_release(sock2);
1581*4882a593Smuzhiyun sock_release(sock1);
1582*4882a593Smuzhiyun goto out;
1583*4882a593Smuzhiyun }
1584*4882a593Smuzhiyun
1585*4882a593Smuzhiyun err = sock1->ops->socketpair(sock1, sock2);
1586*4882a593Smuzhiyun if (unlikely(err < 0)) {
1587*4882a593Smuzhiyun sock_release(sock2);
1588*4882a593Smuzhiyun sock_release(sock1);
1589*4882a593Smuzhiyun goto out;
1590*4882a593Smuzhiyun }
1591*4882a593Smuzhiyun
1592*4882a593Smuzhiyun newfile1 = sock_alloc_file(sock1, flags, NULL);
1593*4882a593Smuzhiyun if (IS_ERR(newfile1)) {
1594*4882a593Smuzhiyun err = PTR_ERR(newfile1);
1595*4882a593Smuzhiyun sock_release(sock2);
1596*4882a593Smuzhiyun goto out;
1597*4882a593Smuzhiyun }
1598*4882a593Smuzhiyun
1599*4882a593Smuzhiyun newfile2 = sock_alloc_file(sock2, flags, NULL);
1600*4882a593Smuzhiyun if (IS_ERR(newfile2)) {
1601*4882a593Smuzhiyun err = PTR_ERR(newfile2);
1602*4882a593Smuzhiyun fput(newfile1);
1603*4882a593Smuzhiyun goto out;
1604*4882a593Smuzhiyun }
1605*4882a593Smuzhiyun
1606*4882a593Smuzhiyun audit_fd_pair(fd1, fd2);
1607*4882a593Smuzhiyun
1608*4882a593Smuzhiyun fd_install(fd1, newfile1);
1609*4882a593Smuzhiyun fd_install(fd2, newfile2);
1610*4882a593Smuzhiyun return 0;
1611*4882a593Smuzhiyun
1612*4882a593Smuzhiyun out:
1613*4882a593Smuzhiyun put_unused_fd(fd2);
1614*4882a593Smuzhiyun put_unused_fd(fd1);
1615*4882a593Smuzhiyun return err;
1616*4882a593Smuzhiyun }
1617*4882a593Smuzhiyun
SYSCALL_DEFINE4(socketpair,int,family,int,type,int,protocol,int __user *,usockvec)1618*4882a593Smuzhiyun SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
1619*4882a593Smuzhiyun int __user *, usockvec)
1620*4882a593Smuzhiyun {
1621*4882a593Smuzhiyun return __sys_socketpair(family, type, protocol, usockvec);
1622*4882a593Smuzhiyun }
1623*4882a593Smuzhiyun
1624*4882a593Smuzhiyun /*
1625*4882a593Smuzhiyun * Bind a name to a socket. Nothing much to do here since it's
1626*4882a593Smuzhiyun * the protocol's responsibility to handle the local address.
1627*4882a593Smuzhiyun *
1628*4882a593Smuzhiyun * We move the socket address to kernel space before we call
1629*4882a593Smuzhiyun * the protocol layer (having also checked the address is ok).
1630*4882a593Smuzhiyun */
1631*4882a593Smuzhiyun
__sys_bind(int fd,struct sockaddr __user * umyaddr,int addrlen)1632*4882a593Smuzhiyun int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
1633*4882a593Smuzhiyun {
1634*4882a593Smuzhiyun struct socket *sock;
1635*4882a593Smuzhiyun struct sockaddr_storage address;
1636*4882a593Smuzhiyun int err, fput_needed;
1637*4882a593Smuzhiyun
1638*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
1639*4882a593Smuzhiyun if (sock) {
1640*4882a593Smuzhiyun err = move_addr_to_kernel(umyaddr, addrlen, &address);
1641*4882a593Smuzhiyun if (!err) {
1642*4882a593Smuzhiyun err = security_socket_bind(sock,
1643*4882a593Smuzhiyun (struct sockaddr *)&address,
1644*4882a593Smuzhiyun addrlen);
1645*4882a593Smuzhiyun if (!err)
1646*4882a593Smuzhiyun err = sock->ops->bind(sock,
1647*4882a593Smuzhiyun (struct sockaddr *)
1648*4882a593Smuzhiyun &address, addrlen);
1649*4882a593Smuzhiyun }
1650*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
1651*4882a593Smuzhiyun }
1652*4882a593Smuzhiyun return err;
1653*4882a593Smuzhiyun }
1654*4882a593Smuzhiyun
SYSCALL_DEFINE3(bind,int,fd,struct sockaddr __user *,umyaddr,int,addrlen)1655*4882a593Smuzhiyun SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
1656*4882a593Smuzhiyun {
1657*4882a593Smuzhiyun return __sys_bind(fd, umyaddr, addrlen);
1658*4882a593Smuzhiyun }
1659*4882a593Smuzhiyun
1660*4882a593Smuzhiyun /*
1661*4882a593Smuzhiyun * Perform a listen. Basically, we allow the protocol to do anything
1662*4882a593Smuzhiyun * necessary for a listen, and if that works, we mark the socket as
1663*4882a593Smuzhiyun * ready for listening.
1664*4882a593Smuzhiyun */
1665*4882a593Smuzhiyun
__sys_listen(int fd,int backlog)1666*4882a593Smuzhiyun int __sys_listen(int fd, int backlog)
1667*4882a593Smuzhiyun {
1668*4882a593Smuzhiyun struct socket *sock;
1669*4882a593Smuzhiyun int err, fput_needed;
1670*4882a593Smuzhiyun int somaxconn;
1671*4882a593Smuzhiyun
1672*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
1673*4882a593Smuzhiyun if (sock) {
1674*4882a593Smuzhiyun somaxconn = READ_ONCE(sock_net(sock->sk)->core.sysctl_somaxconn);
1675*4882a593Smuzhiyun if ((unsigned int)backlog > somaxconn)
1676*4882a593Smuzhiyun backlog = somaxconn;
1677*4882a593Smuzhiyun
1678*4882a593Smuzhiyun err = security_socket_listen(sock, backlog);
1679*4882a593Smuzhiyun if (!err)
1680*4882a593Smuzhiyun err = sock->ops->listen(sock, backlog);
1681*4882a593Smuzhiyun
1682*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
1683*4882a593Smuzhiyun }
1684*4882a593Smuzhiyun return err;
1685*4882a593Smuzhiyun }
1686*4882a593Smuzhiyun
SYSCALL_DEFINE2(listen,int,fd,int,backlog)1687*4882a593Smuzhiyun SYSCALL_DEFINE2(listen, int, fd, int, backlog)
1688*4882a593Smuzhiyun {
1689*4882a593Smuzhiyun return __sys_listen(fd, backlog);
1690*4882a593Smuzhiyun }
1691*4882a593Smuzhiyun
do_accept(struct file * file,unsigned file_flags,struct sockaddr __user * upeer_sockaddr,int __user * upeer_addrlen,int flags)1692*4882a593Smuzhiyun struct file *do_accept(struct file *file, unsigned file_flags,
1693*4882a593Smuzhiyun struct sockaddr __user *upeer_sockaddr,
1694*4882a593Smuzhiyun int __user *upeer_addrlen, int flags)
1695*4882a593Smuzhiyun {
1696*4882a593Smuzhiyun struct socket *sock, *newsock;
1697*4882a593Smuzhiyun struct file *newfile;
1698*4882a593Smuzhiyun int err, len;
1699*4882a593Smuzhiyun struct sockaddr_storage address;
1700*4882a593Smuzhiyun
1701*4882a593Smuzhiyun sock = sock_from_file(file, &err);
1702*4882a593Smuzhiyun if (!sock)
1703*4882a593Smuzhiyun return ERR_PTR(err);
1704*4882a593Smuzhiyun
1705*4882a593Smuzhiyun newsock = sock_alloc();
1706*4882a593Smuzhiyun if (!newsock)
1707*4882a593Smuzhiyun return ERR_PTR(-ENFILE);
1708*4882a593Smuzhiyun
1709*4882a593Smuzhiyun newsock->type = sock->type;
1710*4882a593Smuzhiyun newsock->ops = sock->ops;
1711*4882a593Smuzhiyun
1712*4882a593Smuzhiyun /*
1713*4882a593Smuzhiyun * We don't need try_module_get here, as the listening socket (sock)
1714*4882a593Smuzhiyun * has the protocol module (sock->ops->owner) held.
1715*4882a593Smuzhiyun */
1716*4882a593Smuzhiyun __module_get(newsock->ops->owner);
1717*4882a593Smuzhiyun
1718*4882a593Smuzhiyun newfile = sock_alloc_file(newsock, flags, sock->sk->sk_prot_creator->name);
1719*4882a593Smuzhiyun if (IS_ERR(newfile))
1720*4882a593Smuzhiyun return newfile;
1721*4882a593Smuzhiyun
1722*4882a593Smuzhiyun err = security_socket_accept(sock, newsock);
1723*4882a593Smuzhiyun if (err)
1724*4882a593Smuzhiyun goto out_fd;
1725*4882a593Smuzhiyun
1726*4882a593Smuzhiyun err = sock->ops->accept(sock, newsock, sock->file->f_flags | file_flags,
1727*4882a593Smuzhiyun false);
1728*4882a593Smuzhiyun if (err < 0)
1729*4882a593Smuzhiyun goto out_fd;
1730*4882a593Smuzhiyun
1731*4882a593Smuzhiyun if (upeer_sockaddr) {
1732*4882a593Smuzhiyun len = newsock->ops->getname(newsock,
1733*4882a593Smuzhiyun (struct sockaddr *)&address, 2);
1734*4882a593Smuzhiyun if (len < 0) {
1735*4882a593Smuzhiyun err = -ECONNABORTED;
1736*4882a593Smuzhiyun goto out_fd;
1737*4882a593Smuzhiyun }
1738*4882a593Smuzhiyun err = move_addr_to_user(&address,
1739*4882a593Smuzhiyun len, upeer_sockaddr, upeer_addrlen);
1740*4882a593Smuzhiyun if (err < 0)
1741*4882a593Smuzhiyun goto out_fd;
1742*4882a593Smuzhiyun }
1743*4882a593Smuzhiyun
1744*4882a593Smuzhiyun /* File flags are not inherited via accept() unlike another OSes. */
1745*4882a593Smuzhiyun return newfile;
1746*4882a593Smuzhiyun out_fd:
1747*4882a593Smuzhiyun fput(newfile);
1748*4882a593Smuzhiyun return ERR_PTR(err);
1749*4882a593Smuzhiyun }
1750*4882a593Smuzhiyun
__sys_accept4_file(struct file * file,unsigned file_flags,struct sockaddr __user * upeer_sockaddr,int __user * upeer_addrlen,int flags,unsigned long nofile)1751*4882a593Smuzhiyun int __sys_accept4_file(struct file *file, unsigned file_flags,
1752*4882a593Smuzhiyun struct sockaddr __user *upeer_sockaddr,
1753*4882a593Smuzhiyun int __user *upeer_addrlen, int flags,
1754*4882a593Smuzhiyun unsigned long nofile)
1755*4882a593Smuzhiyun {
1756*4882a593Smuzhiyun struct file *newfile;
1757*4882a593Smuzhiyun int newfd;
1758*4882a593Smuzhiyun
1759*4882a593Smuzhiyun if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1760*4882a593Smuzhiyun return -EINVAL;
1761*4882a593Smuzhiyun
1762*4882a593Smuzhiyun if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1763*4882a593Smuzhiyun flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1764*4882a593Smuzhiyun
1765*4882a593Smuzhiyun newfd = __get_unused_fd_flags(flags, nofile);
1766*4882a593Smuzhiyun if (unlikely(newfd < 0))
1767*4882a593Smuzhiyun return newfd;
1768*4882a593Smuzhiyun
1769*4882a593Smuzhiyun newfile = do_accept(file, file_flags, upeer_sockaddr, upeer_addrlen,
1770*4882a593Smuzhiyun flags);
1771*4882a593Smuzhiyun if (IS_ERR(newfile)) {
1772*4882a593Smuzhiyun put_unused_fd(newfd);
1773*4882a593Smuzhiyun return PTR_ERR(newfile);
1774*4882a593Smuzhiyun }
1775*4882a593Smuzhiyun fd_install(newfd, newfile);
1776*4882a593Smuzhiyun return newfd;
1777*4882a593Smuzhiyun }
1778*4882a593Smuzhiyun
1779*4882a593Smuzhiyun /*
1780*4882a593Smuzhiyun * For accept, we attempt to create a new socket, set up the link
1781*4882a593Smuzhiyun * with the client, wake up the client, then return the new
1782*4882a593Smuzhiyun * connected fd. We collect the address of the connector in kernel
1783*4882a593Smuzhiyun * space and move it to user at the very end. This is unclean because
1784*4882a593Smuzhiyun * we open the socket then return an error.
1785*4882a593Smuzhiyun *
1786*4882a593Smuzhiyun * 1003.1g adds the ability to recvmsg() to query connection pending
1787*4882a593Smuzhiyun * status to recvmsg. We need to add that support in a way thats
1788*4882a593Smuzhiyun * clean when we restructure accept also.
1789*4882a593Smuzhiyun */
1790*4882a593Smuzhiyun
__sys_accept4(int fd,struct sockaddr __user * upeer_sockaddr,int __user * upeer_addrlen,int flags)1791*4882a593Smuzhiyun int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
1792*4882a593Smuzhiyun int __user *upeer_addrlen, int flags)
1793*4882a593Smuzhiyun {
1794*4882a593Smuzhiyun int ret = -EBADF;
1795*4882a593Smuzhiyun struct fd f;
1796*4882a593Smuzhiyun
1797*4882a593Smuzhiyun f = fdget(fd);
1798*4882a593Smuzhiyun if (f.file) {
1799*4882a593Smuzhiyun ret = __sys_accept4_file(f.file, 0, upeer_sockaddr,
1800*4882a593Smuzhiyun upeer_addrlen, flags,
1801*4882a593Smuzhiyun rlimit(RLIMIT_NOFILE));
1802*4882a593Smuzhiyun fdput(f);
1803*4882a593Smuzhiyun }
1804*4882a593Smuzhiyun
1805*4882a593Smuzhiyun return ret;
1806*4882a593Smuzhiyun }
1807*4882a593Smuzhiyun
SYSCALL_DEFINE4(accept4,int,fd,struct sockaddr __user *,upeer_sockaddr,int __user *,upeer_addrlen,int,flags)1808*4882a593Smuzhiyun SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
1809*4882a593Smuzhiyun int __user *, upeer_addrlen, int, flags)
1810*4882a593Smuzhiyun {
1811*4882a593Smuzhiyun return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, flags);
1812*4882a593Smuzhiyun }
1813*4882a593Smuzhiyun
SYSCALL_DEFINE3(accept,int,fd,struct sockaddr __user *,upeer_sockaddr,int __user *,upeer_addrlen)1814*4882a593Smuzhiyun SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr,
1815*4882a593Smuzhiyun int __user *, upeer_addrlen)
1816*4882a593Smuzhiyun {
1817*4882a593Smuzhiyun return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
1818*4882a593Smuzhiyun }
1819*4882a593Smuzhiyun
1820*4882a593Smuzhiyun /*
1821*4882a593Smuzhiyun * Attempt to connect to a socket with the server address. The address
1822*4882a593Smuzhiyun * is in user space so we verify it is OK and move it to kernel space.
1823*4882a593Smuzhiyun *
1824*4882a593Smuzhiyun * For 1003.1g we need to add clean support for a bind to AF_UNSPEC to
1825*4882a593Smuzhiyun * break bindings
1826*4882a593Smuzhiyun *
1827*4882a593Smuzhiyun * NOTE: 1003.1g draft 6.3 is broken with respect to AX.25/NetROM and
1828*4882a593Smuzhiyun * other SEQPACKET protocols that take time to connect() as it doesn't
1829*4882a593Smuzhiyun * include the -EINPROGRESS status for such sockets.
1830*4882a593Smuzhiyun */
1831*4882a593Smuzhiyun
__sys_connect_file(struct file * file,struct sockaddr_storage * address,int addrlen,int file_flags)1832*4882a593Smuzhiyun int __sys_connect_file(struct file *file, struct sockaddr_storage *address,
1833*4882a593Smuzhiyun int addrlen, int file_flags)
1834*4882a593Smuzhiyun {
1835*4882a593Smuzhiyun struct socket *sock;
1836*4882a593Smuzhiyun int err;
1837*4882a593Smuzhiyun
1838*4882a593Smuzhiyun sock = sock_from_file(file, &err);
1839*4882a593Smuzhiyun if (!sock)
1840*4882a593Smuzhiyun goto out;
1841*4882a593Smuzhiyun
1842*4882a593Smuzhiyun err =
1843*4882a593Smuzhiyun security_socket_connect(sock, (struct sockaddr *)address, addrlen);
1844*4882a593Smuzhiyun if (err)
1845*4882a593Smuzhiyun goto out;
1846*4882a593Smuzhiyun
1847*4882a593Smuzhiyun err = sock->ops->connect(sock, (struct sockaddr *)address, addrlen,
1848*4882a593Smuzhiyun sock->file->f_flags | file_flags);
1849*4882a593Smuzhiyun out:
1850*4882a593Smuzhiyun return err;
1851*4882a593Smuzhiyun }
1852*4882a593Smuzhiyun
__sys_connect(int fd,struct sockaddr __user * uservaddr,int addrlen)1853*4882a593Smuzhiyun int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
1854*4882a593Smuzhiyun {
1855*4882a593Smuzhiyun int ret = -EBADF;
1856*4882a593Smuzhiyun struct fd f;
1857*4882a593Smuzhiyun
1858*4882a593Smuzhiyun f = fdget(fd);
1859*4882a593Smuzhiyun if (f.file) {
1860*4882a593Smuzhiyun struct sockaddr_storage address;
1861*4882a593Smuzhiyun
1862*4882a593Smuzhiyun ret = move_addr_to_kernel(uservaddr, addrlen, &address);
1863*4882a593Smuzhiyun if (!ret)
1864*4882a593Smuzhiyun ret = __sys_connect_file(f.file, &address, addrlen, 0);
1865*4882a593Smuzhiyun fdput(f);
1866*4882a593Smuzhiyun }
1867*4882a593Smuzhiyun
1868*4882a593Smuzhiyun return ret;
1869*4882a593Smuzhiyun }
1870*4882a593Smuzhiyun
SYSCALL_DEFINE3(connect,int,fd,struct sockaddr __user *,uservaddr,int,addrlen)1871*4882a593Smuzhiyun SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
1872*4882a593Smuzhiyun int, addrlen)
1873*4882a593Smuzhiyun {
1874*4882a593Smuzhiyun return __sys_connect(fd, uservaddr, addrlen);
1875*4882a593Smuzhiyun }
1876*4882a593Smuzhiyun
1877*4882a593Smuzhiyun /*
1878*4882a593Smuzhiyun * Get the local address ('name') of a socket object. Move the obtained
1879*4882a593Smuzhiyun * name to user space.
1880*4882a593Smuzhiyun */
1881*4882a593Smuzhiyun
__sys_getsockname(int fd,struct sockaddr __user * usockaddr,int __user * usockaddr_len)1882*4882a593Smuzhiyun int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
1883*4882a593Smuzhiyun int __user *usockaddr_len)
1884*4882a593Smuzhiyun {
1885*4882a593Smuzhiyun struct socket *sock;
1886*4882a593Smuzhiyun struct sockaddr_storage address;
1887*4882a593Smuzhiyun int err, fput_needed;
1888*4882a593Smuzhiyun
1889*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
1890*4882a593Smuzhiyun if (!sock)
1891*4882a593Smuzhiyun goto out;
1892*4882a593Smuzhiyun
1893*4882a593Smuzhiyun err = security_socket_getsockname(sock);
1894*4882a593Smuzhiyun if (err)
1895*4882a593Smuzhiyun goto out_put;
1896*4882a593Smuzhiyun
1897*4882a593Smuzhiyun err = sock->ops->getname(sock, (struct sockaddr *)&address, 0);
1898*4882a593Smuzhiyun if (err < 0)
1899*4882a593Smuzhiyun goto out_put;
1900*4882a593Smuzhiyun /* "err" is actually length in this case */
1901*4882a593Smuzhiyun err = move_addr_to_user(&address, err, usockaddr, usockaddr_len);
1902*4882a593Smuzhiyun
1903*4882a593Smuzhiyun out_put:
1904*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
1905*4882a593Smuzhiyun out:
1906*4882a593Smuzhiyun return err;
1907*4882a593Smuzhiyun }
1908*4882a593Smuzhiyun
SYSCALL_DEFINE3(getsockname,int,fd,struct sockaddr __user *,usockaddr,int __user *,usockaddr_len)1909*4882a593Smuzhiyun SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
1910*4882a593Smuzhiyun int __user *, usockaddr_len)
1911*4882a593Smuzhiyun {
1912*4882a593Smuzhiyun return __sys_getsockname(fd, usockaddr, usockaddr_len);
1913*4882a593Smuzhiyun }
1914*4882a593Smuzhiyun
1915*4882a593Smuzhiyun /*
1916*4882a593Smuzhiyun * Get the remote address ('name') of a socket object. Move the obtained
1917*4882a593Smuzhiyun * name to user space.
1918*4882a593Smuzhiyun */
1919*4882a593Smuzhiyun
__sys_getpeername(int fd,struct sockaddr __user * usockaddr,int __user * usockaddr_len)1920*4882a593Smuzhiyun int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
1921*4882a593Smuzhiyun int __user *usockaddr_len)
1922*4882a593Smuzhiyun {
1923*4882a593Smuzhiyun struct socket *sock;
1924*4882a593Smuzhiyun struct sockaddr_storage address;
1925*4882a593Smuzhiyun int err, fput_needed;
1926*4882a593Smuzhiyun
1927*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
1928*4882a593Smuzhiyun if (sock != NULL) {
1929*4882a593Smuzhiyun err = security_socket_getpeername(sock);
1930*4882a593Smuzhiyun if (err) {
1931*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
1932*4882a593Smuzhiyun return err;
1933*4882a593Smuzhiyun }
1934*4882a593Smuzhiyun
1935*4882a593Smuzhiyun err = sock->ops->getname(sock, (struct sockaddr *)&address, 1);
1936*4882a593Smuzhiyun if (err >= 0)
1937*4882a593Smuzhiyun /* "err" is actually length in this case */
1938*4882a593Smuzhiyun err = move_addr_to_user(&address, err, usockaddr,
1939*4882a593Smuzhiyun usockaddr_len);
1940*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
1941*4882a593Smuzhiyun }
1942*4882a593Smuzhiyun return err;
1943*4882a593Smuzhiyun }
1944*4882a593Smuzhiyun
SYSCALL_DEFINE3(getpeername,int,fd,struct sockaddr __user *,usockaddr,int __user *,usockaddr_len)1945*4882a593Smuzhiyun SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
1946*4882a593Smuzhiyun int __user *, usockaddr_len)
1947*4882a593Smuzhiyun {
1948*4882a593Smuzhiyun return __sys_getpeername(fd, usockaddr, usockaddr_len);
1949*4882a593Smuzhiyun }
1950*4882a593Smuzhiyun
1951*4882a593Smuzhiyun /*
1952*4882a593Smuzhiyun * Send a datagram to a given address. We move the address into kernel
1953*4882a593Smuzhiyun * space and check the user space data area is readable before invoking
1954*4882a593Smuzhiyun * the protocol.
1955*4882a593Smuzhiyun */
__sys_sendto(int fd,void __user * buff,size_t len,unsigned int flags,struct sockaddr __user * addr,int addr_len)1956*4882a593Smuzhiyun int __sys_sendto(int fd, void __user *buff, size_t len, unsigned int flags,
1957*4882a593Smuzhiyun struct sockaddr __user *addr, int addr_len)
1958*4882a593Smuzhiyun {
1959*4882a593Smuzhiyun struct socket *sock;
1960*4882a593Smuzhiyun struct sockaddr_storage address;
1961*4882a593Smuzhiyun int err;
1962*4882a593Smuzhiyun struct msghdr msg;
1963*4882a593Smuzhiyun struct iovec iov;
1964*4882a593Smuzhiyun int fput_needed;
1965*4882a593Smuzhiyun
1966*4882a593Smuzhiyun err = import_single_range(WRITE, buff, len, &iov, &msg.msg_iter);
1967*4882a593Smuzhiyun if (unlikely(err))
1968*4882a593Smuzhiyun return err;
1969*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
1970*4882a593Smuzhiyun if (!sock)
1971*4882a593Smuzhiyun goto out;
1972*4882a593Smuzhiyun
1973*4882a593Smuzhiyun msg.msg_name = NULL;
1974*4882a593Smuzhiyun msg.msg_control = NULL;
1975*4882a593Smuzhiyun msg.msg_controllen = 0;
1976*4882a593Smuzhiyun msg.msg_namelen = 0;
1977*4882a593Smuzhiyun if (addr) {
1978*4882a593Smuzhiyun err = move_addr_to_kernel(addr, addr_len, &address);
1979*4882a593Smuzhiyun if (err < 0)
1980*4882a593Smuzhiyun goto out_put;
1981*4882a593Smuzhiyun msg.msg_name = (struct sockaddr *)&address;
1982*4882a593Smuzhiyun msg.msg_namelen = addr_len;
1983*4882a593Smuzhiyun }
1984*4882a593Smuzhiyun if (sock->file->f_flags & O_NONBLOCK)
1985*4882a593Smuzhiyun flags |= MSG_DONTWAIT;
1986*4882a593Smuzhiyun msg.msg_flags = flags;
1987*4882a593Smuzhiyun err = sock_sendmsg(sock, &msg);
1988*4882a593Smuzhiyun
1989*4882a593Smuzhiyun out_put:
1990*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
1991*4882a593Smuzhiyun out:
1992*4882a593Smuzhiyun return err;
1993*4882a593Smuzhiyun }
1994*4882a593Smuzhiyun
SYSCALL_DEFINE6(sendto,int,fd,void __user *,buff,size_t,len,unsigned int,flags,struct sockaddr __user *,addr,int,addr_len)1995*4882a593Smuzhiyun SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1996*4882a593Smuzhiyun unsigned int, flags, struct sockaddr __user *, addr,
1997*4882a593Smuzhiyun int, addr_len)
1998*4882a593Smuzhiyun {
1999*4882a593Smuzhiyun return __sys_sendto(fd, buff, len, flags, addr, addr_len);
2000*4882a593Smuzhiyun }
2001*4882a593Smuzhiyun
2002*4882a593Smuzhiyun /*
2003*4882a593Smuzhiyun * Send a datagram down a socket.
2004*4882a593Smuzhiyun */
2005*4882a593Smuzhiyun
SYSCALL_DEFINE4(send,int,fd,void __user *,buff,size_t,len,unsigned int,flags)2006*4882a593Smuzhiyun SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
2007*4882a593Smuzhiyun unsigned int, flags)
2008*4882a593Smuzhiyun {
2009*4882a593Smuzhiyun return __sys_sendto(fd, buff, len, flags, NULL, 0);
2010*4882a593Smuzhiyun }
2011*4882a593Smuzhiyun
2012*4882a593Smuzhiyun /*
2013*4882a593Smuzhiyun * Receive a frame from the socket and optionally record the address of the
2014*4882a593Smuzhiyun * sender. We verify the buffers are writable and if needed move the
2015*4882a593Smuzhiyun * sender address from kernel to user space.
2016*4882a593Smuzhiyun */
__sys_recvfrom(int fd,void __user * ubuf,size_t size,unsigned int flags,struct sockaddr __user * addr,int __user * addr_len)2017*4882a593Smuzhiyun int __sys_recvfrom(int fd, void __user *ubuf, size_t size, unsigned int flags,
2018*4882a593Smuzhiyun struct sockaddr __user *addr, int __user *addr_len)
2019*4882a593Smuzhiyun {
2020*4882a593Smuzhiyun struct socket *sock;
2021*4882a593Smuzhiyun struct iovec iov;
2022*4882a593Smuzhiyun struct msghdr msg;
2023*4882a593Smuzhiyun struct sockaddr_storage address;
2024*4882a593Smuzhiyun int err, err2;
2025*4882a593Smuzhiyun int fput_needed;
2026*4882a593Smuzhiyun
2027*4882a593Smuzhiyun err = import_single_range(READ, ubuf, size, &iov, &msg.msg_iter);
2028*4882a593Smuzhiyun if (unlikely(err))
2029*4882a593Smuzhiyun return err;
2030*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
2031*4882a593Smuzhiyun if (!sock)
2032*4882a593Smuzhiyun goto out;
2033*4882a593Smuzhiyun
2034*4882a593Smuzhiyun msg.msg_control = NULL;
2035*4882a593Smuzhiyun msg.msg_controllen = 0;
2036*4882a593Smuzhiyun /* Save some cycles and don't copy the address if not needed */
2037*4882a593Smuzhiyun msg.msg_name = addr ? (struct sockaddr *)&address : NULL;
2038*4882a593Smuzhiyun /* We assume all kernel code knows the size of sockaddr_storage */
2039*4882a593Smuzhiyun msg.msg_namelen = 0;
2040*4882a593Smuzhiyun msg.msg_iocb = NULL;
2041*4882a593Smuzhiyun msg.msg_flags = 0;
2042*4882a593Smuzhiyun if (sock->file->f_flags & O_NONBLOCK)
2043*4882a593Smuzhiyun flags |= MSG_DONTWAIT;
2044*4882a593Smuzhiyun err = sock_recvmsg(sock, &msg, flags);
2045*4882a593Smuzhiyun
2046*4882a593Smuzhiyun if (err >= 0 && addr != NULL) {
2047*4882a593Smuzhiyun err2 = move_addr_to_user(&address,
2048*4882a593Smuzhiyun msg.msg_namelen, addr, addr_len);
2049*4882a593Smuzhiyun if (err2 < 0)
2050*4882a593Smuzhiyun err = err2;
2051*4882a593Smuzhiyun }
2052*4882a593Smuzhiyun
2053*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
2054*4882a593Smuzhiyun out:
2055*4882a593Smuzhiyun return err;
2056*4882a593Smuzhiyun }
2057*4882a593Smuzhiyun
SYSCALL_DEFINE6(recvfrom,int,fd,void __user *,ubuf,size_t,size,unsigned int,flags,struct sockaddr __user *,addr,int __user *,addr_len)2058*4882a593Smuzhiyun SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
2059*4882a593Smuzhiyun unsigned int, flags, struct sockaddr __user *, addr,
2060*4882a593Smuzhiyun int __user *, addr_len)
2061*4882a593Smuzhiyun {
2062*4882a593Smuzhiyun return __sys_recvfrom(fd, ubuf, size, flags, addr, addr_len);
2063*4882a593Smuzhiyun }
2064*4882a593Smuzhiyun
2065*4882a593Smuzhiyun /*
2066*4882a593Smuzhiyun * Receive a datagram from a socket.
2067*4882a593Smuzhiyun */
2068*4882a593Smuzhiyun
SYSCALL_DEFINE4(recv,int,fd,void __user *,ubuf,size_t,size,unsigned int,flags)2069*4882a593Smuzhiyun SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, size_t, size,
2070*4882a593Smuzhiyun unsigned int, flags)
2071*4882a593Smuzhiyun {
2072*4882a593Smuzhiyun return __sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
2073*4882a593Smuzhiyun }
2074*4882a593Smuzhiyun
sock_use_custom_sol_socket(const struct socket * sock)2075*4882a593Smuzhiyun static bool sock_use_custom_sol_socket(const struct socket *sock)
2076*4882a593Smuzhiyun {
2077*4882a593Smuzhiyun const struct sock *sk = sock->sk;
2078*4882a593Smuzhiyun
2079*4882a593Smuzhiyun /* Use sock->ops->setsockopt() for MPTCP */
2080*4882a593Smuzhiyun return IS_ENABLED(CONFIG_MPTCP) &&
2081*4882a593Smuzhiyun sk->sk_protocol == IPPROTO_MPTCP &&
2082*4882a593Smuzhiyun sk->sk_type == SOCK_STREAM &&
2083*4882a593Smuzhiyun (sk->sk_family == AF_INET || sk->sk_family == AF_INET6);
2084*4882a593Smuzhiyun }
2085*4882a593Smuzhiyun
2086*4882a593Smuzhiyun /*
2087*4882a593Smuzhiyun * Set a socket option. Because we don't know the option lengths we have
2088*4882a593Smuzhiyun * to pass the user mode parameter for the protocols to sort out.
2089*4882a593Smuzhiyun */
__sys_setsockopt(int fd,int level,int optname,char __user * user_optval,int optlen)2090*4882a593Smuzhiyun int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval,
2091*4882a593Smuzhiyun int optlen)
2092*4882a593Smuzhiyun {
2093*4882a593Smuzhiyun sockptr_t optval = USER_SOCKPTR(user_optval);
2094*4882a593Smuzhiyun char *kernel_optval = NULL;
2095*4882a593Smuzhiyun int err, fput_needed;
2096*4882a593Smuzhiyun struct socket *sock;
2097*4882a593Smuzhiyun
2098*4882a593Smuzhiyun if (optlen < 0)
2099*4882a593Smuzhiyun return -EINVAL;
2100*4882a593Smuzhiyun
2101*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
2102*4882a593Smuzhiyun if (!sock)
2103*4882a593Smuzhiyun return err;
2104*4882a593Smuzhiyun
2105*4882a593Smuzhiyun err = security_socket_setsockopt(sock, level, optname);
2106*4882a593Smuzhiyun if (err)
2107*4882a593Smuzhiyun goto out_put;
2108*4882a593Smuzhiyun
2109*4882a593Smuzhiyun if (!in_compat_syscall())
2110*4882a593Smuzhiyun err = BPF_CGROUP_RUN_PROG_SETSOCKOPT(sock->sk, &level, &optname,
2111*4882a593Smuzhiyun user_optval, &optlen,
2112*4882a593Smuzhiyun &kernel_optval);
2113*4882a593Smuzhiyun if (err < 0)
2114*4882a593Smuzhiyun goto out_put;
2115*4882a593Smuzhiyun if (err > 0) {
2116*4882a593Smuzhiyun err = 0;
2117*4882a593Smuzhiyun goto out_put;
2118*4882a593Smuzhiyun }
2119*4882a593Smuzhiyun
2120*4882a593Smuzhiyun if (kernel_optval)
2121*4882a593Smuzhiyun optval = KERNEL_SOCKPTR(kernel_optval);
2122*4882a593Smuzhiyun if (level == SOL_SOCKET && !sock_use_custom_sol_socket(sock))
2123*4882a593Smuzhiyun err = sock_setsockopt(sock, level, optname, optval, optlen);
2124*4882a593Smuzhiyun else if (unlikely(!sock->ops->setsockopt))
2125*4882a593Smuzhiyun err = -EOPNOTSUPP;
2126*4882a593Smuzhiyun else
2127*4882a593Smuzhiyun err = sock->ops->setsockopt(sock, level, optname, optval,
2128*4882a593Smuzhiyun optlen);
2129*4882a593Smuzhiyun kfree(kernel_optval);
2130*4882a593Smuzhiyun out_put:
2131*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
2132*4882a593Smuzhiyun return err;
2133*4882a593Smuzhiyun }
2134*4882a593Smuzhiyun
SYSCALL_DEFINE5(setsockopt,int,fd,int,level,int,optname,char __user *,optval,int,optlen)2135*4882a593Smuzhiyun SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
2136*4882a593Smuzhiyun char __user *, optval, int, optlen)
2137*4882a593Smuzhiyun {
2138*4882a593Smuzhiyun return __sys_setsockopt(fd, level, optname, optval, optlen);
2139*4882a593Smuzhiyun }
2140*4882a593Smuzhiyun
2141*4882a593Smuzhiyun /*
2142*4882a593Smuzhiyun * Get a socket option. Because we don't know the option lengths we have
2143*4882a593Smuzhiyun * to pass a user mode parameter for the protocols to sort out.
2144*4882a593Smuzhiyun */
__sys_getsockopt(int fd,int level,int optname,char __user * optval,int __user * optlen)2145*4882a593Smuzhiyun int __sys_getsockopt(int fd, int level, int optname, char __user *optval,
2146*4882a593Smuzhiyun int __user *optlen)
2147*4882a593Smuzhiyun {
2148*4882a593Smuzhiyun int err, fput_needed;
2149*4882a593Smuzhiyun struct socket *sock;
2150*4882a593Smuzhiyun int max_optlen;
2151*4882a593Smuzhiyun
2152*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
2153*4882a593Smuzhiyun if (!sock)
2154*4882a593Smuzhiyun return err;
2155*4882a593Smuzhiyun
2156*4882a593Smuzhiyun err = security_socket_getsockopt(sock, level, optname);
2157*4882a593Smuzhiyun if (err)
2158*4882a593Smuzhiyun goto out_put;
2159*4882a593Smuzhiyun
2160*4882a593Smuzhiyun if (!in_compat_syscall())
2161*4882a593Smuzhiyun max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen);
2162*4882a593Smuzhiyun
2163*4882a593Smuzhiyun if (level == SOL_SOCKET)
2164*4882a593Smuzhiyun err = sock_getsockopt(sock, level, optname, optval, optlen);
2165*4882a593Smuzhiyun else if (unlikely(!sock->ops->getsockopt))
2166*4882a593Smuzhiyun err = -EOPNOTSUPP;
2167*4882a593Smuzhiyun else
2168*4882a593Smuzhiyun err = sock->ops->getsockopt(sock, level, optname, optval,
2169*4882a593Smuzhiyun optlen);
2170*4882a593Smuzhiyun
2171*4882a593Smuzhiyun if (!in_compat_syscall())
2172*4882a593Smuzhiyun err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname,
2173*4882a593Smuzhiyun optval, optlen, max_optlen,
2174*4882a593Smuzhiyun err);
2175*4882a593Smuzhiyun out_put:
2176*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
2177*4882a593Smuzhiyun return err;
2178*4882a593Smuzhiyun }
2179*4882a593Smuzhiyun
SYSCALL_DEFINE5(getsockopt,int,fd,int,level,int,optname,char __user *,optval,int __user *,optlen)2180*4882a593Smuzhiyun SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
2181*4882a593Smuzhiyun char __user *, optval, int __user *, optlen)
2182*4882a593Smuzhiyun {
2183*4882a593Smuzhiyun return __sys_getsockopt(fd, level, optname, optval, optlen);
2184*4882a593Smuzhiyun }
2185*4882a593Smuzhiyun
2186*4882a593Smuzhiyun /*
2187*4882a593Smuzhiyun * Shutdown a socket.
2188*4882a593Smuzhiyun */
2189*4882a593Smuzhiyun
__sys_shutdown_sock(struct socket * sock,int how)2190*4882a593Smuzhiyun int __sys_shutdown_sock(struct socket *sock, int how)
2191*4882a593Smuzhiyun {
2192*4882a593Smuzhiyun int err;
2193*4882a593Smuzhiyun
2194*4882a593Smuzhiyun err = security_socket_shutdown(sock, how);
2195*4882a593Smuzhiyun if (!err)
2196*4882a593Smuzhiyun err = sock->ops->shutdown(sock, how);
2197*4882a593Smuzhiyun
2198*4882a593Smuzhiyun return err;
2199*4882a593Smuzhiyun }
2200*4882a593Smuzhiyun
__sys_shutdown(int fd,int how)2201*4882a593Smuzhiyun int __sys_shutdown(int fd, int how)
2202*4882a593Smuzhiyun {
2203*4882a593Smuzhiyun int err, fput_needed;
2204*4882a593Smuzhiyun struct socket *sock;
2205*4882a593Smuzhiyun
2206*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
2207*4882a593Smuzhiyun if (sock != NULL) {
2208*4882a593Smuzhiyun err = __sys_shutdown_sock(sock, how);
2209*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
2210*4882a593Smuzhiyun }
2211*4882a593Smuzhiyun return err;
2212*4882a593Smuzhiyun }
2213*4882a593Smuzhiyun
SYSCALL_DEFINE2(shutdown,int,fd,int,how)2214*4882a593Smuzhiyun SYSCALL_DEFINE2(shutdown, int, fd, int, how)
2215*4882a593Smuzhiyun {
2216*4882a593Smuzhiyun return __sys_shutdown(fd, how);
2217*4882a593Smuzhiyun }
2218*4882a593Smuzhiyun
2219*4882a593Smuzhiyun /* A couple of helpful macros for getting the address of the 32/64 bit
2220*4882a593Smuzhiyun * fields which are the same type (int / unsigned) on our platforms.
2221*4882a593Smuzhiyun */
2222*4882a593Smuzhiyun #define COMPAT_MSG(msg, member) ((MSG_CMSG_COMPAT & flags) ? &msg##_compat->member : &msg->member)
2223*4882a593Smuzhiyun #define COMPAT_NAMELEN(msg) COMPAT_MSG(msg, msg_namelen)
2224*4882a593Smuzhiyun #define COMPAT_FLAGS(msg) COMPAT_MSG(msg, msg_flags)
2225*4882a593Smuzhiyun
2226*4882a593Smuzhiyun struct used_address {
2227*4882a593Smuzhiyun struct sockaddr_storage name;
2228*4882a593Smuzhiyun unsigned int name_len;
2229*4882a593Smuzhiyun };
2230*4882a593Smuzhiyun
__copy_msghdr_from_user(struct msghdr * kmsg,struct user_msghdr __user * umsg,struct sockaddr __user ** save_addr,struct iovec __user ** uiov,size_t * nsegs)2231*4882a593Smuzhiyun int __copy_msghdr_from_user(struct msghdr *kmsg,
2232*4882a593Smuzhiyun struct user_msghdr __user *umsg,
2233*4882a593Smuzhiyun struct sockaddr __user **save_addr,
2234*4882a593Smuzhiyun struct iovec __user **uiov, size_t *nsegs)
2235*4882a593Smuzhiyun {
2236*4882a593Smuzhiyun struct user_msghdr msg;
2237*4882a593Smuzhiyun ssize_t err;
2238*4882a593Smuzhiyun
2239*4882a593Smuzhiyun if (copy_from_user(&msg, umsg, sizeof(*umsg)))
2240*4882a593Smuzhiyun return -EFAULT;
2241*4882a593Smuzhiyun
2242*4882a593Smuzhiyun kmsg->msg_control_is_user = true;
2243*4882a593Smuzhiyun kmsg->msg_control_user = msg.msg_control;
2244*4882a593Smuzhiyun kmsg->msg_controllen = msg.msg_controllen;
2245*4882a593Smuzhiyun kmsg->msg_flags = msg.msg_flags;
2246*4882a593Smuzhiyun
2247*4882a593Smuzhiyun kmsg->msg_namelen = msg.msg_namelen;
2248*4882a593Smuzhiyun if (!msg.msg_name)
2249*4882a593Smuzhiyun kmsg->msg_namelen = 0;
2250*4882a593Smuzhiyun
2251*4882a593Smuzhiyun if (kmsg->msg_namelen < 0)
2252*4882a593Smuzhiyun return -EINVAL;
2253*4882a593Smuzhiyun
2254*4882a593Smuzhiyun if (kmsg->msg_namelen > sizeof(struct sockaddr_storage))
2255*4882a593Smuzhiyun kmsg->msg_namelen = sizeof(struct sockaddr_storage);
2256*4882a593Smuzhiyun
2257*4882a593Smuzhiyun if (save_addr)
2258*4882a593Smuzhiyun *save_addr = msg.msg_name;
2259*4882a593Smuzhiyun
2260*4882a593Smuzhiyun if (msg.msg_name && kmsg->msg_namelen) {
2261*4882a593Smuzhiyun if (!save_addr) {
2262*4882a593Smuzhiyun err = move_addr_to_kernel(msg.msg_name,
2263*4882a593Smuzhiyun kmsg->msg_namelen,
2264*4882a593Smuzhiyun kmsg->msg_name);
2265*4882a593Smuzhiyun if (err < 0)
2266*4882a593Smuzhiyun return err;
2267*4882a593Smuzhiyun }
2268*4882a593Smuzhiyun } else {
2269*4882a593Smuzhiyun kmsg->msg_name = NULL;
2270*4882a593Smuzhiyun kmsg->msg_namelen = 0;
2271*4882a593Smuzhiyun }
2272*4882a593Smuzhiyun
2273*4882a593Smuzhiyun if (msg.msg_iovlen > UIO_MAXIOV)
2274*4882a593Smuzhiyun return -EMSGSIZE;
2275*4882a593Smuzhiyun
2276*4882a593Smuzhiyun kmsg->msg_iocb = NULL;
2277*4882a593Smuzhiyun *uiov = msg.msg_iov;
2278*4882a593Smuzhiyun *nsegs = msg.msg_iovlen;
2279*4882a593Smuzhiyun return 0;
2280*4882a593Smuzhiyun }
2281*4882a593Smuzhiyun
copy_msghdr_from_user(struct msghdr * kmsg,struct user_msghdr __user * umsg,struct sockaddr __user ** save_addr,struct iovec ** iov)2282*4882a593Smuzhiyun static int copy_msghdr_from_user(struct msghdr *kmsg,
2283*4882a593Smuzhiyun struct user_msghdr __user *umsg,
2284*4882a593Smuzhiyun struct sockaddr __user **save_addr,
2285*4882a593Smuzhiyun struct iovec **iov)
2286*4882a593Smuzhiyun {
2287*4882a593Smuzhiyun struct user_msghdr msg;
2288*4882a593Smuzhiyun ssize_t err;
2289*4882a593Smuzhiyun
2290*4882a593Smuzhiyun err = __copy_msghdr_from_user(kmsg, umsg, save_addr, &msg.msg_iov,
2291*4882a593Smuzhiyun &msg.msg_iovlen);
2292*4882a593Smuzhiyun if (err)
2293*4882a593Smuzhiyun return err;
2294*4882a593Smuzhiyun
2295*4882a593Smuzhiyun err = import_iovec(save_addr ? READ : WRITE,
2296*4882a593Smuzhiyun msg.msg_iov, msg.msg_iovlen,
2297*4882a593Smuzhiyun UIO_FASTIOV, iov, &kmsg->msg_iter);
2298*4882a593Smuzhiyun return err < 0 ? err : 0;
2299*4882a593Smuzhiyun }
2300*4882a593Smuzhiyun
____sys_sendmsg(struct socket * sock,struct msghdr * msg_sys,unsigned int flags,struct used_address * used_address,unsigned int allowed_msghdr_flags)2301*4882a593Smuzhiyun static int ____sys_sendmsg(struct socket *sock, struct msghdr *msg_sys,
2302*4882a593Smuzhiyun unsigned int flags, struct used_address *used_address,
2303*4882a593Smuzhiyun unsigned int allowed_msghdr_flags)
2304*4882a593Smuzhiyun {
2305*4882a593Smuzhiyun unsigned char ctl[sizeof(struct cmsghdr) + 20]
2306*4882a593Smuzhiyun __aligned(sizeof(__kernel_size_t));
2307*4882a593Smuzhiyun /* 20 is size of ipv6_pktinfo */
2308*4882a593Smuzhiyun unsigned char *ctl_buf = ctl;
2309*4882a593Smuzhiyun int ctl_len;
2310*4882a593Smuzhiyun ssize_t err;
2311*4882a593Smuzhiyun
2312*4882a593Smuzhiyun err = -ENOBUFS;
2313*4882a593Smuzhiyun
2314*4882a593Smuzhiyun if (msg_sys->msg_controllen > INT_MAX)
2315*4882a593Smuzhiyun goto out;
2316*4882a593Smuzhiyun flags |= (msg_sys->msg_flags & allowed_msghdr_flags);
2317*4882a593Smuzhiyun ctl_len = msg_sys->msg_controllen;
2318*4882a593Smuzhiyun if ((MSG_CMSG_COMPAT & flags) && ctl_len) {
2319*4882a593Smuzhiyun err =
2320*4882a593Smuzhiyun cmsghdr_from_user_compat_to_kern(msg_sys, sock->sk, ctl,
2321*4882a593Smuzhiyun sizeof(ctl));
2322*4882a593Smuzhiyun if (err)
2323*4882a593Smuzhiyun goto out;
2324*4882a593Smuzhiyun ctl_buf = msg_sys->msg_control;
2325*4882a593Smuzhiyun ctl_len = msg_sys->msg_controllen;
2326*4882a593Smuzhiyun } else if (ctl_len) {
2327*4882a593Smuzhiyun BUILD_BUG_ON(sizeof(struct cmsghdr) !=
2328*4882a593Smuzhiyun CMSG_ALIGN(sizeof(struct cmsghdr)));
2329*4882a593Smuzhiyun if (ctl_len > sizeof(ctl)) {
2330*4882a593Smuzhiyun ctl_buf = sock_kmalloc(sock->sk, ctl_len, GFP_KERNEL);
2331*4882a593Smuzhiyun if (ctl_buf == NULL)
2332*4882a593Smuzhiyun goto out;
2333*4882a593Smuzhiyun }
2334*4882a593Smuzhiyun err = -EFAULT;
2335*4882a593Smuzhiyun if (copy_from_user(ctl_buf, msg_sys->msg_control_user, ctl_len))
2336*4882a593Smuzhiyun goto out_freectl;
2337*4882a593Smuzhiyun msg_sys->msg_control = ctl_buf;
2338*4882a593Smuzhiyun msg_sys->msg_control_is_user = false;
2339*4882a593Smuzhiyun }
2340*4882a593Smuzhiyun msg_sys->msg_flags = flags;
2341*4882a593Smuzhiyun
2342*4882a593Smuzhiyun if (sock->file->f_flags & O_NONBLOCK)
2343*4882a593Smuzhiyun msg_sys->msg_flags |= MSG_DONTWAIT;
2344*4882a593Smuzhiyun /*
2345*4882a593Smuzhiyun * If this is sendmmsg() and current destination address is same as
2346*4882a593Smuzhiyun * previously succeeded address, omit asking LSM's decision.
2347*4882a593Smuzhiyun * used_address->name_len is initialized to UINT_MAX so that the first
2348*4882a593Smuzhiyun * destination address never matches.
2349*4882a593Smuzhiyun */
2350*4882a593Smuzhiyun if (used_address && msg_sys->msg_name &&
2351*4882a593Smuzhiyun used_address->name_len == msg_sys->msg_namelen &&
2352*4882a593Smuzhiyun !memcmp(&used_address->name, msg_sys->msg_name,
2353*4882a593Smuzhiyun used_address->name_len)) {
2354*4882a593Smuzhiyun err = sock_sendmsg_nosec(sock, msg_sys);
2355*4882a593Smuzhiyun goto out_freectl;
2356*4882a593Smuzhiyun }
2357*4882a593Smuzhiyun err = sock_sendmsg(sock, msg_sys);
2358*4882a593Smuzhiyun /*
2359*4882a593Smuzhiyun * If this is sendmmsg() and sending to current destination address was
2360*4882a593Smuzhiyun * successful, remember it.
2361*4882a593Smuzhiyun */
2362*4882a593Smuzhiyun if (used_address && err >= 0) {
2363*4882a593Smuzhiyun used_address->name_len = msg_sys->msg_namelen;
2364*4882a593Smuzhiyun if (msg_sys->msg_name)
2365*4882a593Smuzhiyun memcpy(&used_address->name, msg_sys->msg_name,
2366*4882a593Smuzhiyun used_address->name_len);
2367*4882a593Smuzhiyun }
2368*4882a593Smuzhiyun
2369*4882a593Smuzhiyun out_freectl:
2370*4882a593Smuzhiyun if (ctl_buf != ctl)
2371*4882a593Smuzhiyun sock_kfree_s(sock->sk, ctl_buf, ctl_len);
2372*4882a593Smuzhiyun out:
2373*4882a593Smuzhiyun return err;
2374*4882a593Smuzhiyun }
2375*4882a593Smuzhiyun
sendmsg_copy_msghdr(struct msghdr * msg,struct user_msghdr __user * umsg,unsigned flags,struct iovec ** iov)2376*4882a593Smuzhiyun int sendmsg_copy_msghdr(struct msghdr *msg,
2377*4882a593Smuzhiyun struct user_msghdr __user *umsg, unsigned flags,
2378*4882a593Smuzhiyun struct iovec **iov)
2379*4882a593Smuzhiyun {
2380*4882a593Smuzhiyun int err;
2381*4882a593Smuzhiyun
2382*4882a593Smuzhiyun if (flags & MSG_CMSG_COMPAT) {
2383*4882a593Smuzhiyun struct compat_msghdr __user *msg_compat;
2384*4882a593Smuzhiyun
2385*4882a593Smuzhiyun msg_compat = (struct compat_msghdr __user *) umsg;
2386*4882a593Smuzhiyun err = get_compat_msghdr(msg, msg_compat, NULL, iov);
2387*4882a593Smuzhiyun } else {
2388*4882a593Smuzhiyun err = copy_msghdr_from_user(msg, umsg, NULL, iov);
2389*4882a593Smuzhiyun }
2390*4882a593Smuzhiyun if (err < 0)
2391*4882a593Smuzhiyun return err;
2392*4882a593Smuzhiyun
2393*4882a593Smuzhiyun return 0;
2394*4882a593Smuzhiyun }
2395*4882a593Smuzhiyun
___sys_sendmsg(struct socket * sock,struct user_msghdr __user * msg,struct msghdr * msg_sys,unsigned int flags,struct used_address * used_address,unsigned int allowed_msghdr_flags)2396*4882a593Smuzhiyun static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
2397*4882a593Smuzhiyun struct msghdr *msg_sys, unsigned int flags,
2398*4882a593Smuzhiyun struct used_address *used_address,
2399*4882a593Smuzhiyun unsigned int allowed_msghdr_flags)
2400*4882a593Smuzhiyun {
2401*4882a593Smuzhiyun struct sockaddr_storage address;
2402*4882a593Smuzhiyun struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
2403*4882a593Smuzhiyun ssize_t err;
2404*4882a593Smuzhiyun
2405*4882a593Smuzhiyun msg_sys->msg_name = &address;
2406*4882a593Smuzhiyun
2407*4882a593Smuzhiyun err = sendmsg_copy_msghdr(msg_sys, msg, flags, &iov);
2408*4882a593Smuzhiyun if (err < 0)
2409*4882a593Smuzhiyun return err;
2410*4882a593Smuzhiyun
2411*4882a593Smuzhiyun err = ____sys_sendmsg(sock, msg_sys, flags, used_address,
2412*4882a593Smuzhiyun allowed_msghdr_flags);
2413*4882a593Smuzhiyun kfree(iov);
2414*4882a593Smuzhiyun return err;
2415*4882a593Smuzhiyun }
2416*4882a593Smuzhiyun
2417*4882a593Smuzhiyun /*
2418*4882a593Smuzhiyun * BSD sendmsg interface
2419*4882a593Smuzhiyun */
__sys_sendmsg_sock(struct socket * sock,struct msghdr * msg,unsigned int flags)2420*4882a593Smuzhiyun long __sys_sendmsg_sock(struct socket *sock, struct msghdr *msg,
2421*4882a593Smuzhiyun unsigned int flags)
2422*4882a593Smuzhiyun {
2423*4882a593Smuzhiyun return ____sys_sendmsg(sock, msg, flags, NULL, 0);
2424*4882a593Smuzhiyun }
2425*4882a593Smuzhiyun
__sys_sendmsg(int fd,struct user_msghdr __user * msg,unsigned int flags,bool forbid_cmsg_compat)2426*4882a593Smuzhiyun long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
2427*4882a593Smuzhiyun bool forbid_cmsg_compat)
2428*4882a593Smuzhiyun {
2429*4882a593Smuzhiyun int fput_needed, err;
2430*4882a593Smuzhiyun struct msghdr msg_sys;
2431*4882a593Smuzhiyun struct socket *sock;
2432*4882a593Smuzhiyun
2433*4882a593Smuzhiyun if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
2434*4882a593Smuzhiyun return -EINVAL;
2435*4882a593Smuzhiyun
2436*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
2437*4882a593Smuzhiyun if (!sock)
2438*4882a593Smuzhiyun goto out;
2439*4882a593Smuzhiyun
2440*4882a593Smuzhiyun err = ___sys_sendmsg(sock, msg, &msg_sys, flags, NULL, 0);
2441*4882a593Smuzhiyun
2442*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
2443*4882a593Smuzhiyun out:
2444*4882a593Smuzhiyun return err;
2445*4882a593Smuzhiyun }
2446*4882a593Smuzhiyun
SYSCALL_DEFINE3(sendmsg,int,fd,struct user_msghdr __user *,msg,unsigned int,flags)2447*4882a593Smuzhiyun SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr __user *, msg, unsigned int, flags)
2448*4882a593Smuzhiyun {
2449*4882a593Smuzhiyun return __sys_sendmsg(fd, msg, flags, true);
2450*4882a593Smuzhiyun }
2451*4882a593Smuzhiyun
2452*4882a593Smuzhiyun /*
2453*4882a593Smuzhiyun * Linux sendmmsg interface
2454*4882a593Smuzhiyun */
2455*4882a593Smuzhiyun
__sys_sendmmsg(int fd,struct mmsghdr __user * mmsg,unsigned int vlen,unsigned int flags,bool forbid_cmsg_compat)2456*4882a593Smuzhiyun int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
2457*4882a593Smuzhiyun unsigned int flags, bool forbid_cmsg_compat)
2458*4882a593Smuzhiyun {
2459*4882a593Smuzhiyun int fput_needed, err, datagrams;
2460*4882a593Smuzhiyun struct socket *sock;
2461*4882a593Smuzhiyun struct mmsghdr __user *entry;
2462*4882a593Smuzhiyun struct compat_mmsghdr __user *compat_entry;
2463*4882a593Smuzhiyun struct msghdr msg_sys;
2464*4882a593Smuzhiyun struct used_address used_address;
2465*4882a593Smuzhiyun unsigned int oflags = flags;
2466*4882a593Smuzhiyun
2467*4882a593Smuzhiyun if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
2468*4882a593Smuzhiyun return -EINVAL;
2469*4882a593Smuzhiyun
2470*4882a593Smuzhiyun if (vlen > UIO_MAXIOV)
2471*4882a593Smuzhiyun vlen = UIO_MAXIOV;
2472*4882a593Smuzhiyun
2473*4882a593Smuzhiyun datagrams = 0;
2474*4882a593Smuzhiyun
2475*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
2476*4882a593Smuzhiyun if (!sock)
2477*4882a593Smuzhiyun return err;
2478*4882a593Smuzhiyun
2479*4882a593Smuzhiyun used_address.name_len = UINT_MAX;
2480*4882a593Smuzhiyun entry = mmsg;
2481*4882a593Smuzhiyun compat_entry = (struct compat_mmsghdr __user *)mmsg;
2482*4882a593Smuzhiyun err = 0;
2483*4882a593Smuzhiyun flags |= MSG_BATCH;
2484*4882a593Smuzhiyun
2485*4882a593Smuzhiyun while (datagrams < vlen) {
2486*4882a593Smuzhiyun if (datagrams == vlen - 1)
2487*4882a593Smuzhiyun flags = oflags;
2488*4882a593Smuzhiyun
2489*4882a593Smuzhiyun if (MSG_CMSG_COMPAT & flags) {
2490*4882a593Smuzhiyun err = ___sys_sendmsg(sock, (struct user_msghdr __user *)compat_entry,
2491*4882a593Smuzhiyun &msg_sys, flags, &used_address, MSG_EOR);
2492*4882a593Smuzhiyun if (err < 0)
2493*4882a593Smuzhiyun break;
2494*4882a593Smuzhiyun err = __put_user(err, &compat_entry->msg_len);
2495*4882a593Smuzhiyun ++compat_entry;
2496*4882a593Smuzhiyun } else {
2497*4882a593Smuzhiyun err = ___sys_sendmsg(sock,
2498*4882a593Smuzhiyun (struct user_msghdr __user *)entry,
2499*4882a593Smuzhiyun &msg_sys, flags, &used_address, MSG_EOR);
2500*4882a593Smuzhiyun if (err < 0)
2501*4882a593Smuzhiyun break;
2502*4882a593Smuzhiyun err = put_user(err, &entry->msg_len);
2503*4882a593Smuzhiyun ++entry;
2504*4882a593Smuzhiyun }
2505*4882a593Smuzhiyun
2506*4882a593Smuzhiyun if (err)
2507*4882a593Smuzhiyun break;
2508*4882a593Smuzhiyun ++datagrams;
2509*4882a593Smuzhiyun if (msg_data_left(&msg_sys))
2510*4882a593Smuzhiyun break;
2511*4882a593Smuzhiyun cond_resched();
2512*4882a593Smuzhiyun }
2513*4882a593Smuzhiyun
2514*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
2515*4882a593Smuzhiyun
2516*4882a593Smuzhiyun /* We only return an error if no datagrams were able to be sent */
2517*4882a593Smuzhiyun if (datagrams != 0)
2518*4882a593Smuzhiyun return datagrams;
2519*4882a593Smuzhiyun
2520*4882a593Smuzhiyun return err;
2521*4882a593Smuzhiyun }
2522*4882a593Smuzhiyun
SYSCALL_DEFINE4(sendmmsg,int,fd,struct mmsghdr __user *,mmsg,unsigned int,vlen,unsigned int,flags)2523*4882a593Smuzhiyun SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg,
2524*4882a593Smuzhiyun unsigned int, vlen, unsigned int, flags)
2525*4882a593Smuzhiyun {
2526*4882a593Smuzhiyun return __sys_sendmmsg(fd, mmsg, vlen, flags, true);
2527*4882a593Smuzhiyun }
2528*4882a593Smuzhiyun
recvmsg_copy_msghdr(struct msghdr * msg,struct user_msghdr __user * umsg,unsigned flags,struct sockaddr __user ** uaddr,struct iovec ** iov)2529*4882a593Smuzhiyun int recvmsg_copy_msghdr(struct msghdr *msg,
2530*4882a593Smuzhiyun struct user_msghdr __user *umsg, unsigned flags,
2531*4882a593Smuzhiyun struct sockaddr __user **uaddr,
2532*4882a593Smuzhiyun struct iovec **iov)
2533*4882a593Smuzhiyun {
2534*4882a593Smuzhiyun ssize_t err;
2535*4882a593Smuzhiyun
2536*4882a593Smuzhiyun if (MSG_CMSG_COMPAT & flags) {
2537*4882a593Smuzhiyun struct compat_msghdr __user *msg_compat;
2538*4882a593Smuzhiyun
2539*4882a593Smuzhiyun msg_compat = (struct compat_msghdr __user *) umsg;
2540*4882a593Smuzhiyun err = get_compat_msghdr(msg, msg_compat, uaddr, iov);
2541*4882a593Smuzhiyun } else {
2542*4882a593Smuzhiyun err = copy_msghdr_from_user(msg, umsg, uaddr, iov);
2543*4882a593Smuzhiyun }
2544*4882a593Smuzhiyun if (err < 0)
2545*4882a593Smuzhiyun return err;
2546*4882a593Smuzhiyun
2547*4882a593Smuzhiyun return 0;
2548*4882a593Smuzhiyun }
2549*4882a593Smuzhiyun
____sys_recvmsg(struct socket * sock,struct msghdr * msg_sys,struct user_msghdr __user * msg,struct sockaddr __user * uaddr,unsigned int flags,int nosec)2550*4882a593Smuzhiyun static int ____sys_recvmsg(struct socket *sock, struct msghdr *msg_sys,
2551*4882a593Smuzhiyun struct user_msghdr __user *msg,
2552*4882a593Smuzhiyun struct sockaddr __user *uaddr,
2553*4882a593Smuzhiyun unsigned int flags, int nosec)
2554*4882a593Smuzhiyun {
2555*4882a593Smuzhiyun struct compat_msghdr __user *msg_compat =
2556*4882a593Smuzhiyun (struct compat_msghdr __user *) msg;
2557*4882a593Smuzhiyun int __user *uaddr_len = COMPAT_NAMELEN(msg);
2558*4882a593Smuzhiyun struct sockaddr_storage addr;
2559*4882a593Smuzhiyun unsigned long cmsg_ptr;
2560*4882a593Smuzhiyun int len;
2561*4882a593Smuzhiyun ssize_t err;
2562*4882a593Smuzhiyun
2563*4882a593Smuzhiyun msg_sys->msg_name = &addr;
2564*4882a593Smuzhiyun cmsg_ptr = (unsigned long)msg_sys->msg_control;
2565*4882a593Smuzhiyun msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);
2566*4882a593Smuzhiyun
2567*4882a593Smuzhiyun /* We assume all kernel code knows the size of sockaddr_storage */
2568*4882a593Smuzhiyun msg_sys->msg_namelen = 0;
2569*4882a593Smuzhiyun
2570*4882a593Smuzhiyun if (sock->file->f_flags & O_NONBLOCK)
2571*4882a593Smuzhiyun flags |= MSG_DONTWAIT;
2572*4882a593Smuzhiyun
2573*4882a593Smuzhiyun if (unlikely(nosec))
2574*4882a593Smuzhiyun err = sock_recvmsg_nosec(sock, msg_sys, flags);
2575*4882a593Smuzhiyun else
2576*4882a593Smuzhiyun err = sock_recvmsg(sock, msg_sys, flags);
2577*4882a593Smuzhiyun
2578*4882a593Smuzhiyun if (err < 0)
2579*4882a593Smuzhiyun goto out;
2580*4882a593Smuzhiyun len = err;
2581*4882a593Smuzhiyun
2582*4882a593Smuzhiyun if (uaddr != NULL) {
2583*4882a593Smuzhiyun err = move_addr_to_user(&addr,
2584*4882a593Smuzhiyun msg_sys->msg_namelen, uaddr,
2585*4882a593Smuzhiyun uaddr_len);
2586*4882a593Smuzhiyun if (err < 0)
2587*4882a593Smuzhiyun goto out;
2588*4882a593Smuzhiyun }
2589*4882a593Smuzhiyun err = __put_user((msg_sys->msg_flags & ~MSG_CMSG_COMPAT),
2590*4882a593Smuzhiyun COMPAT_FLAGS(msg));
2591*4882a593Smuzhiyun if (err)
2592*4882a593Smuzhiyun goto out;
2593*4882a593Smuzhiyun if (MSG_CMSG_COMPAT & flags)
2594*4882a593Smuzhiyun err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
2595*4882a593Smuzhiyun &msg_compat->msg_controllen);
2596*4882a593Smuzhiyun else
2597*4882a593Smuzhiyun err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
2598*4882a593Smuzhiyun &msg->msg_controllen);
2599*4882a593Smuzhiyun if (err)
2600*4882a593Smuzhiyun goto out;
2601*4882a593Smuzhiyun err = len;
2602*4882a593Smuzhiyun out:
2603*4882a593Smuzhiyun return err;
2604*4882a593Smuzhiyun }
2605*4882a593Smuzhiyun
___sys_recvmsg(struct socket * sock,struct user_msghdr __user * msg,struct msghdr * msg_sys,unsigned int flags,int nosec)2606*4882a593Smuzhiyun static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
2607*4882a593Smuzhiyun struct msghdr *msg_sys, unsigned int flags, int nosec)
2608*4882a593Smuzhiyun {
2609*4882a593Smuzhiyun struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
2610*4882a593Smuzhiyun /* user mode address pointers */
2611*4882a593Smuzhiyun struct sockaddr __user *uaddr;
2612*4882a593Smuzhiyun ssize_t err;
2613*4882a593Smuzhiyun
2614*4882a593Smuzhiyun err = recvmsg_copy_msghdr(msg_sys, msg, flags, &uaddr, &iov);
2615*4882a593Smuzhiyun if (err < 0)
2616*4882a593Smuzhiyun return err;
2617*4882a593Smuzhiyun
2618*4882a593Smuzhiyun err = ____sys_recvmsg(sock, msg_sys, msg, uaddr, flags, nosec);
2619*4882a593Smuzhiyun kfree(iov);
2620*4882a593Smuzhiyun return err;
2621*4882a593Smuzhiyun }
2622*4882a593Smuzhiyun
2623*4882a593Smuzhiyun /*
2624*4882a593Smuzhiyun * BSD recvmsg interface
2625*4882a593Smuzhiyun */
2626*4882a593Smuzhiyun
__sys_recvmsg_sock(struct socket * sock,struct msghdr * msg,struct user_msghdr __user * umsg,struct sockaddr __user * uaddr,unsigned int flags)2627*4882a593Smuzhiyun long __sys_recvmsg_sock(struct socket *sock, struct msghdr *msg,
2628*4882a593Smuzhiyun struct user_msghdr __user *umsg,
2629*4882a593Smuzhiyun struct sockaddr __user *uaddr, unsigned int flags)
2630*4882a593Smuzhiyun {
2631*4882a593Smuzhiyun return ____sys_recvmsg(sock, msg, umsg, uaddr, flags, 0);
2632*4882a593Smuzhiyun }
2633*4882a593Smuzhiyun
__sys_recvmsg(int fd,struct user_msghdr __user * msg,unsigned int flags,bool forbid_cmsg_compat)2634*4882a593Smuzhiyun long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
2635*4882a593Smuzhiyun bool forbid_cmsg_compat)
2636*4882a593Smuzhiyun {
2637*4882a593Smuzhiyun int fput_needed, err;
2638*4882a593Smuzhiyun struct msghdr msg_sys;
2639*4882a593Smuzhiyun struct socket *sock;
2640*4882a593Smuzhiyun
2641*4882a593Smuzhiyun if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
2642*4882a593Smuzhiyun return -EINVAL;
2643*4882a593Smuzhiyun
2644*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
2645*4882a593Smuzhiyun if (!sock)
2646*4882a593Smuzhiyun goto out;
2647*4882a593Smuzhiyun
2648*4882a593Smuzhiyun err = ___sys_recvmsg(sock, msg, &msg_sys, flags, 0);
2649*4882a593Smuzhiyun
2650*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
2651*4882a593Smuzhiyun out:
2652*4882a593Smuzhiyun return err;
2653*4882a593Smuzhiyun }
2654*4882a593Smuzhiyun
SYSCALL_DEFINE3(recvmsg,int,fd,struct user_msghdr __user *,msg,unsigned int,flags)2655*4882a593Smuzhiyun SYSCALL_DEFINE3(recvmsg, int, fd, struct user_msghdr __user *, msg,
2656*4882a593Smuzhiyun unsigned int, flags)
2657*4882a593Smuzhiyun {
2658*4882a593Smuzhiyun return __sys_recvmsg(fd, msg, flags, true);
2659*4882a593Smuzhiyun }
2660*4882a593Smuzhiyun
2661*4882a593Smuzhiyun /*
2662*4882a593Smuzhiyun * Linux recvmmsg interface
2663*4882a593Smuzhiyun */
2664*4882a593Smuzhiyun
do_recvmmsg(int fd,struct mmsghdr __user * mmsg,unsigned int vlen,unsigned int flags,struct timespec64 * timeout)2665*4882a593Smuzhiyun static int do_recvmmsg(int fd, struct mmsghdr __user *mmsg,
2666*4882a593Smuzhiyun unsigned int vlen, unsigned int flags,
2667*4882a593Smuzhiyun struct timespec64 *timeout)
2668*4882a593Smuzhiyun {
2669*4882a593Smuzhiyun int fput_needed, err, datagrams;
2670*4882a593Smuzhiyun struct socket *sock;
2671*4882a593Smuzhiyun struct mmsghdr __user *entry;
2672*4882a593Smuzhiyun struct compat_mmsghdr __user *compat_entry;
2673*4882a593Smuzhiyun struct msghdr msg_sys;
2674*4882a593Smuzhiyun struct timespec64 end_time;
2675*4882a593Smuzhiyun struct timespec64 timeout64;
2676*4882a593Smuzhiyun
2677*4882a593Smuzhiyun if (timeout &&
2678*4882a593Smuzhiyun poll_select_set_timeout(&end_time, timeout->tv_sec,
2679*4882a593Smuzhiyun timeout->tv_nsec))
2680*4882a593Smuzhiyun return -EINVAL;
2681*4882a593Smuzhiyun
2682*4882a593Smuzhiyun datagrams = 0;
2683*4882a593Smuzhiyun
2684*4882a593Smuzhiyun sock = sockfd_lookup_light(fd, &err, &fput_needed);
2685*4882a593Smuzhiyun if (!sock)
2686*4882a593Smuzhiyun return err;
2687*4882a593Smuzhiyun
2688*4882a593Smuzhiyun if (likely(!(flags & MSG_ERRQUEUE))) {
2689*4882a593Smuzhiyun err = sock_error(sock->sk);
2690*4882a593Smuzhiyun if (err) {
2691*4882a593Smuzhiyun datagrams = err;
2692*4882a593Smuzhiyun goto out_put;
2693*4882a593Smuzhiyun }
2694*4882a593Smuzhiyun }
2695*4882a593Smuzhiyun
2696*4882a593Smuzhiyun entry = mmsg;
2697*4882a593Smuzhiyun compat_entry = (struct compat_mmsghdr __user *)mmsg;
2698*4882a593Smuzhiyun
2699*4882a593Smuzhiyun while (datagrams < vlen) {
2700*4882a593Smuzhiyun /*
2701*4882a593Smuzhiyun * No need to ask LSM for more than the first datagram.
2702*4882a593Smuzhiyun */
2703*4882a593Smuzhiyun if (MSG_CMSG_COMPAT & flags) {
2704*4882a593Smuzhiyun err = ___sys_recvmsg(sock, (struct user_msghdr __user *)compat_entry,
2705*4882a593Smuzhiyun &msg_sys, flags & ~MSG_WAITFORONE,
2706*4882a593Smuzhiyun datagrams);
2707*4882a593Smuzhiyun if (err < 0)
2708*4882a593Smuzhiyun break;
2709*4882a593Smuzhiyun err = __put_user(err, &compat_entry->msg_len);
2710*4882a593Smuzhiyun ++compat_entry;
2711*4882a593Smuzhiyun } else {
2712*4882a593Smuzhiyun err = ___sys_recvmsg(sock,
2713*4882a593Smuzhiyun (struct user_msghdr __user *)entry,
2714*4882a593Smuzhiyun &msg_sys, flags & ~MSG_WAITFORONE,
2715*4882a593Smuzhiyun datagrams);
2716*4882a593Smuzhiyun if (err < 0)
2717*4882a593Smuzhiyun break;
2718*4882a593Smuzhiyun err = put_user(err, &entry->msg_len);
2719*4882a593Smuzhiyun ++entry;
2720*4882a593Smuzhiyun }
2721*4882a593Smuzhiyun
2722*4882a593Smuzhiyun if (err)
2723*4882a593Smuzhiyun break;
2724*4882a593Smuzhiyun ++datagrams;
2725*4882a593Smuzhiyun
2726*4882a593Smuzhiyun /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */
2727*4882a593Smuzhiyun if (flags & MSG_WAITFORONE)
2728*4882a593Smuzhiyun flags |= MSG_DONTWAIT;
2729*4882a593Smuzhiyun
2730*4882a593Smuzhiyun if (timeout) {
2731*4882a593Smuzhiyun ktime_get_ts64(&timeout64);
2732*4882a593Smuzhiyun *timeout = timespec64_sub(end_time, timeout64);
2733*4882a593Smuzhiyun if (timeout->tv_sec < 0) {
2734*4882a593Smuzhiyun timeout->tv_sec = timeout->tv_nsec = 0;
2735*4882a593Smuzhiyun break;
2736*4882a593Smuzhiyun }
2737*4882a593Smuzhiyun
2738*4882a593Smuzhiyun /* Timeout, return less than vlen datagrams */
2739*4882a593Smuzhiyun if (timeout->tv_nsec == 0 && timeout->tv_sec == 0)
2740*4882a593Smuzhiyun break;
2741*4882a593Smuzhiyun }
2742*4882a593Smuzhiyun
2743*4882a593Smuzhiyun /* Out of band data, return right away */
2744*4882a593Smuzhiyun if (msg_sys.msg_flags & MSG_OOB)
2745*4882a593Smuzhiyun break;
2746*4882a593Smuzhiyun cond_resched();
2747*4882a593Smuzhiyun }
2748*4882a593Smuzhiyun
2749*4882a593Smuzhiyun if (err == 0)
2750*4882a593Smuzhiyun goto out_put;
2751*4882a593Smuzhiyun
2752*4882a593Smuzhiyun if (datagrams == 0) {
2753*4882a593Smuzhiyun datagrams = err;
2754*4882a593Smuzhiyun goto out_put;
2755*4882a593Smuzhiyun }
2756*4882a593Smuzhiyun
2757*4882a593Smuzhiyun /*
2758*4882a593Smuzhiyun * We may return less entries than requested (vlen) if the
2759*4882a593Smuzhiyun * sock is non block and there aren't enough datagrams...
2760*4882a593Smuzhiyun */
2761*4882a593Smuzhiyun if (err != -EAGAIN) {
2762*4882a593Smuzhiyun /*
2763*4882a593Smuzhiyun * ... or if recvmsg returns an error after we
2764*4882a593Smuzhiyun * received some datagrams, where we record the
2765*4882a593Smuzhiyun * error to return on the next call or if the
2766*4882a593Smuzhiyun * app asks about it using getsockopt(SO_ERROR).
2767*4882a593Smuzhiyun */
2768*4882a593Smuzhiyun sock->sk->sk_err = -err;
2769*4882a593Smuzhiyun }
2770*4882a593Smuzhiyun out_put:
2771*4882a593Smuzhiyun fput_light(sock->file, fput_needed);
2772*4882a593Smuzhiyun
2773*4882a593Smuzhiyun return datagrams;
2774*4882a593Smuzhiyun }
2775*4882a593Smuzhiyun
__sys_recvmmsg(int fd,struct mmsghdr __user * mmsg,unsigned int vlen,unsigned int flags,struct __kernel_timespec __user * timeout,struct old_timespec32 __user * timeout32)2776*4882a593Smuzhiyun int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
2777*4882a593Smuzhiyun unsigned int vlen, unsigned int flags,
2778*4882a593Smuzhiyun struct __kernel_timespec __user *timeout,
2779*4882a593Smuzhiyun struct old_timespec32 __user *timeout32)
2780*4882a593Smuzhiyun {
2781*4882a593Smuzhiyun int datagrams;
2782*4882a593Smuzhiyun struct timespec64 timeout_sys;
2783*4882a593Smuzhiyun
2784*4882a593Smuzhiyun if (timeout && get_timespec64(&timeout_sys, timeout))
2785*4882a593Smuzhiyun return -EFAULT;
2786*4882a593Smuzhiyun
2787*4882a593Smuzhiyun if (timeout32 && get_old_timespec32(&timeout_sys, timeout32))
2788*4882a593Smuzhiyun return -EFAULT;
2789*4882a593Smuzhiyun
2790*4882a593Smuzhiyun if (!timeout && !timeout32)
2791*4882a593Smuzhiyun return do_recvmmsg(fd, mmsg, vlen, flags, NULL);
2792*4882a593Smuzhiyun
2793*4882a593Smuzhiyun datagrams = do_recvmmsg(fd, mmsg, vlen, flags, &timeout_sys);
2794*4882a593Smuzhiyun
2795*4882a593Smuzhiyun if (datagrams <= 0)
2796*4882a593Smuzhiyun return datagrams;
2797*4882a593Smuzhiyun
2798*4882a593Smuzhiyun if (timeout && put_timespec64(&timeout_sys, timeout))
2799*4882a593Smuzhiyun datagrams = -EFAULT;
2800*4882a593Smuzhiyun
2801*4882a593Smuzhiyun if (timeout32 && put_old_timespec32(&timeout_sys, timeout32))
2802*4882a593Smuzhiyun datagrams = -EFAULT;
2803*4882a593Smuzhiyun
2804*4882a593Smuzhiyun return datagrams;
2805*4882a593Smuzhiyun }
2806*4882a593Smuzhiyun
SYSCALL_DEFINE5(recvmmsg,int,fd,struct mmsghdr __user *,mmsg,unsigned int,vlen,unsigned int,flags,struct __kernel_timespec __user *,timeout)2807*4882a593Smuzhiyun SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
2808*4882a593Smuzhiyun unsigned int, vlen, unsigned int, flags,
2809*4882a593Smuzhiyun struct __kernel_timespec __user *, timeout)
2810*4882a593Smuzhiyun {
2811*4882a593Smuzhiyun if (flags & MSG_CMSG_COMPAT)
2812*4882a593Smuzhiyun return -EINVAL;
2813*4882a593Smuzhiyun
2814*4882a593Smuzhiyun return __sys_recvmmsg(fd, mmsg, vlen, flags, timeout, NULL);
2815*4882a593Smuzhiyun }
2816*4882a593Smuzhiyun
2817*4882a593Smuzhiyun #ifdef CONFIG_COMPAT_32BIT_TIME
SYSCALL_DEFINE5(recvmmsg_time32,int,fd,struct mmsghdr __user *,mmsg,unsigned int,vlen,unsigned int,flags,struct old_timespec32 __user *,timeout)2818*4882a593Smuzhiyun SYSCALL_DEFINE5(recvmmsg_time32, int, fd, struct mmsghdr __user *, mmsg,
2819*4882a593Smuzhiyun unsigned int, vlen, unsigned int, flags,
2820*4882a593Smuzhiyun struct old_timespec32 __user *, timeout)
2821*4882a593Smuzhiyun {
2822*4882a593Smuzhiyun if (flags & MSG_CMSG_COMPAT)
2823*4882a593Smuzhiyun return -EINVAL;
2824*4882a593Smuzhiyun
2825*4882a593Smuzhiyun return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL, timeout);
2826*4882a593Smuzhiyun }
2827*4882a593Smuzhiyun #endif
2828*4882a593Smuzhiyun
2829*4882a593Smuzhiyun #ifdef __ARCH_WANT_SYS_SOCKETCALL
2830*4882a593Smuzhiyun /* Argument list sizes for sys_socketcall */
2831*4882a593Smuzhiyun #define AL(x) ((x) * sizeof(unsigned long))
2832*4882a593Smuzhiyun static const unsigned char nargs[21] = {
2833*4882a593Smuzhiyun AL(0), AL(3), AL(3), AL(3), AL(2), AL(3),
2834*4882a593Smuzhiyun AL(3), AL(3), AL(4), AL(4), AL(4), AL(6),
2835*4882a593Smuzhiyun AL(6), AL(2), AL(5), AL(5), AL(3), AL(3),
2836*4882a593Smuzhiyun AL(4), AL(5), AL(4)
2837*4882a593Smuzhiyun };
2838*4882a593Smuzhiyun
2839*4882a593Smuzhiyun #undef AL
2840*4882a593Smuzhiyun
2841*4882a593Smuzhiyun /*
2842*4882a593Smuzhiyun * System call vectors.
2843*4882a593Smuzhiyun *
2844*4882a593Smuzhiyun * Argument checking cleaned up. Saved 20% in size.
2845*4882a593Smuzhiyun * This function doesn't need to set the kernel lock because
2846*4882a593Smuzhiyun * it is set by the callees.
2847*4882a593Smuzhiyun */
2848*4882a593Smuzhiyun
SYSCALL_DEFINE2(socketcall,int,call,unsigned long __user *,args)2849*4882a593Smuzhiyun SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
2850*4882a593Smuzhiyun {
2851*4882a593Smuzhiyun unsigned long a[AUDITSC_ARGS];
2852*4882a593Smuzhiyun unsigned long a0, a1;
2853*4882a593Smuzhiyun int err;
2854*4882a593Smuzhiyun unsigned int len;
2855*4882a593Smuzhiyun
2856*4882a593Smuzhiyun if (call < 1 || call > SYS_SENDMMSG)
2857*4882a593Smuzhiyun return -EINVAL;
2858*4882a593Smuzhiyun call = array_index_nospec(call, SYS_SENDMMSG + 1);
2859*4882a593Smuzhiyun
2860*4882a593Smuzhiyun len = nargs[call];
2861*4882a593Smuzhiyun if (len > sizeof(a))
2862*4882a593Smuzhiyun return -EINVAL;
2863*4882a593Smuzhiyun
2864*4882a593Smuzhiyun /* copy_from_user should be SMP safe. */
2865*4882a593Smuzhiyun if (copy_from_user(a, args, len))
2866*4882a593Smuzhiyun return -EFAULT;
2867*4882a593Smuzhiyun
2868*4882a593Smuzhiyun err = audit_socketcall(nargs[call] / sizeof(unsigned long), a);
2869*4882a593Smuzhiyun if (err)
2870*4882a593Smuzhiyun return err;
2871*4882a593Smuzhiyun
2872*4882a593Smuzhiyun a0 = a[0];
2873*4882a593Smuzhiyun a1 = a[1];
2874*4882a593Smuzhiyun
2875*4882a593Smuzhiyun switch (call) {
2876*4882a593Smuzhiyun case SYS_SOCKET:
2877*4882a593Smuzhiyun err = __sys_socket(a0, a1, a[2]);
2878*4882a593Smuzhiyun break;
2879*4882a593Smuzhiyun case SYS_BIND:
2880*4882a593Smuzhiyun err = __sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
2881*4882a593Smuzhiyun break;
2882*4882a593Smuzhiyun case SYS_CONNECT:
2883*4882a593Smuzhiyun err = __sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
2884*4882a593Smuzhiyun break;
2885*4882a593Smuzhiyun case SYS_LISTEN:
2886*4882a593Smuzhiyun err = __sys_listen(a0, a1);
2887*4882a593Smuzhiyun break;
2888*4882a593Smuzhiyun case SYS_ACCEPT:
2889*4882a593Smuzhiyun err = __sys_accept4(a0, (struct sockaddr __user *)a1,
2890*4882a593Smuzhiyun (int __user *)a[2], 0);
2891*4882a593Smuzhiyun break;
2892*4882a593Smuzhiyun case SYS_GETSOCKNAME:
2893*4882a593Smuzhiyun err =
2894*4882a593Smuzhiyun __sys_getsockname(a0, (struct sockaddr __user *)a1,
2895*4882a593Smuzhiyun (int __user *)a[2]);
2896*4882a593Smuzhiyun break;
2897*4882a593Smuzhiyun case SYS_GETPEERNAME:
2898*4882a593Smuzhiyun err =
2899*4882a593Smuzhiyun __sys_getpeername(a0, (struct sockaddr __user *)a1,
2900*4882a593Smuzhiyun (int __user *)a[2]);
2901*4882a593Smuzhiyun break;
2902*4882a593Smuzhiyun case SYS_SOCKETPAIR:
2903*4882a593Smuzhiyun err = __sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
2904*4882a593Smuzhiyun break;
2905*4882a593Smuzhiyun case SYS_SEND:
2906*4882a593Smuzhiyun err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
2907*4882a593Smuzhiyun NULL, 0);
2908*4882a593Smuzhiyun break;
2909*4882a593Smuzhiyun case SYS_SENDTO:
2910*4882a593Smuzhiyun err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
2911*4882a593Smuzhiyun (struct sockaddr __user *)a[4], a[5]);
2912*4882a593Smuzhiyun break;
2913*4882a593Smuzhiyun case SYS_RECV:
2914*4882a593Smuzhiyun err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
2915*4882a593Smuzhiyun NULL, NULL);
2916*4882a593Smuzhiyun break;
2917*4882a593Smuzhiyun case SYS_RECVFROM:
2918*4882a593Smuzhiyun err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
2919*4882a593Smuzhiyun (struct sockaddr __user *)a[4],
2920*4882a593Smuzhiyun (int __user *)a[5]);
2921*4882a593Smuzhiyun break;
2922*4882a593Smuzhiyun case SYS_SHUTDOWN:
2923*4882a593Smuzhiyun err = __sys_shutdown(a0, a1);
2924*4882a593Smuzhiyun break;
2925*4882a593Smuzhiyun case SYS_SETSOCKOPT:
2926*4882a593Smuzhiyun err = __sys_setsockopt(a0, a1, a[2], (char __user *)a[3],
2927*4882a593Smuzhiyun a[4]);
2928*4882a593Smuzhiyun break;
2929*4882a593Smuzhiyun case SYS_GETSOCKOPT:
2930*4882a593Smuzhiyun err =
2931*4882a593Smuzhiyun __sys_getsockopt(a0, a1, a[2], (char __user *)a[3],
2932*4882a593Smuzhiyun (int __user *)a[4]);
2933*4882a593Smuzhiyun break;
2934*4882a593Smuzhiyun case SYS_SENDMSG:
2935*4882a593Smuzhiyun err = __sys_sendmsg(a0, (struct user_msghdr __user *)a1,
2936*4882a593Smuzhiyun a[2], true);
2937*4882a593Smuzhiyun break;
2938*4882a593Smuzhiyun case SYS_SENDMMSG:
2939*4882a593Smuzhiyun err = __sys_sendmmsg(a0, (struct mmsghdr __user *)a1, a[2],
2940*4882a593Smuzhiyun a[3], true);
2941*4882a593Smuzhiyun break;
2942*4882a593Smuzhiyun case SYS_RECVMSG:
2943*4882a593Smuzhiyun err = __sys_recvmsg(a0, (struct user_msghdr __user *)a1,
2944*4882a593Smuzhiyun a[2], true);
2945*4882a593Smuzhiyun break;
2946*4882a593Smuzhiyun case SYS_RECVMMSG:
2947*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_64BIT))
2948*4882a593Smuzhiyun err = __sys_recvmmsg(a0, (struct mmsghdr __user *)a1,
2949*4882a593Smuzhiyun a[2], a[3],
2950*4882a593Smuzhiyun (struct __kernel_timespec __user *)a[4],
2951*4882a593Smuzhiyun NULL);
2952*4882a593Smuzhiyun else
2953*4882a593Smuzhiyun err = __sys_recvmmsg(a0, (struct mmsghdr __user *)a1,
2954*4882a593Smuzhiyun a[2], a[3], NULL,
2955*4882a593Smuzhiyun (struct old_timespec32 __user *)a[4]);
2956*4882a593Smuzhiyun break;
2957*4882a593Smuzhiyun case SYS_ACCEPT4:
2958*4882a593Smuzhiyun err = __sys_accept4(a0, (struct sockaddr __user *)a1,
2959*4882a593Smuzhiyun (int __user *)a[2], a[3]);
2960*4882a593Smuzhiyun break;
2961*4882a593Smuzhiyun default:
2962*4882a593Smuzhiyun err = -EINVAL;
2963*4882a593Smuzhiyun break;
2964*4882a593Smuzhiyun }
2965*4882a593Smuzhiyun return err;
2966*4882a593Smuzhiyun }
2967*4882a593Smuzhiyun
2968*4882a593Smuzhiyun #endif /* __ARCH_WANT_SYS_SOCKETCALL */
2969*4882a593Smuzhiyun
2970*4882a593Smuzhiyun /**
2971*4882a593Smuzhiyun * sock_register - add a socket protocol handler
2972*4882a593Smuzhiyun * @ops: description of protocol
2973*4882a593Smuzhiyun *
2974*4882a593Smuzhiyun * This function is called by a protocol handler that wants to
2975*4882a593Smuzhiyun * advertise its address family, and have it linked into the
2976*4882a593Smuzhiyun * socket interface. The value ops->family corresponds to the
2977*4882a593Smuzhiyun * socket system call protocol family.
2978*4882a593Smuzhiyun */
sock_register(const struct net_proto_family * ops)2979*4882a593Smuzhiyun int sock_register(const struct net_proto_family *ops)
2980*4882a593Smuzhiyun {
2981*4882a593Smuzhiyun int err;
2982*4882a593Smuzhiyun
2983*4882a593Smuzhiyun if (ops->family >= NPROTO) {
2984*4882a593Smuzhiyun pr_crit("protocol %d >= NPROTO(%d)\n", ops->family, NPROTO);
2985*4882a593Smuzhiyun return -ENOBUFS;
2986*4882a593Smuzhiyun }
2987*4882a593Smuzhiyun
2988*4882a593Smuzhiyun spin_lock(&net_family_lock);
2989*4882a593Smuzhiyun if (rcu_dereference_protected(net_families[ops->family],
2990*4882a593Smuzhiyun lockdep_is_held(&net_family_lock)))
2991*4882a593Smuzhiyun err = -EEXIST;
2992*4882a593Smuzhiyun else {
2993*4882a593Smuzhiyun rcu_assign_pointer(net_families[ops->family], ops);
2994*4882a593Smuzhiyun err = 0;
2995*4882a593Smuzhiyun }
2996*4882a593Smuzhiyun spin_unlock(&net_family_lock);
2997*4882a593Smuzhiyun
2998*4882a593Smuzhiyun pr_info("NET: Registered protocol family %d\n", ops->family);
2999*4882a593Smuzhiyun return err;
3000*4882a593Smuzhiyun }
3001*4882a593Smuzhiyun EXPORT_SYMBOL(sock_register);
3002*4882a593Smuzhiyun
3003*4882a593Smuzhiyun /**
3004*4882a593Smuzhiyun * sock_unregister - remove a protocol handler
3005*4882a593Smuzhiyun * @family: protocol family to remove
3006*4882a593Smuzhiyun *
3007*4882a593Smuzhiyun * This function is called by a protocol handler that wants to
3008*4882a593Smuzhiyun * remove its address family, and have it unlinked from the
3009*4882a593Smuzhiyun * new socket creation.
3010*4882a593Smuzhiyun *
3011*4882a593Smuzhiyun * If protocol handler is a module, then it can use module reference
3012*4882a593Smuzhiyun * counts to protect against new references. If protocol handler is not
3013*4882a593Smuzhiyun * a module then it needs to provide its own protection in
3014*4882a593Smuzhiyun * the ops->create routine.
3015*4882a593Smuzhiyun */
sock_unregister(int family)3016*4882a593Smuzhiyun void sock_unregister(int family)
3017*4882a593Smuzhiyun {
3018*4882a593Smuzhiyun BUG_ON(family < 0 || family >= NPROTO);
3019*4882a593Smuzhiyun
3020*4882a593Smuzhiyun spin_lock(&net_family_lock);
3021*4882a593Smuzhiyun RCU_INIT_POINTER(net_families[family], NULL);
3022*4882a593Smuzhiyun spin_unlock(&net_family_lock);
3023*4882a593Smuzhiyun
3024*4882a593Smuzhiyun synchronize_rcu();
3025*4882a593Smuzhiyun
3026*4882a593Smuzhiyun pr_info("NET: Unregistered protocol family %d\n", family);
3027*4882a593Smuzhiyun }
3028*4882a593Smuzhiyun EXPORT_SYMBOL(sock_unregister);
3029*4882a593Smuzhiyun
sock_is_registered(int family)3030*4882a593Smuzhiyun bool sock_is_registered(int family)
3031*4882a593Smuzhiyun {
3032*4882a593Smuzhiyun return family < NPROTO && rcu_access_pointer(net_families[family]);
3033*4882a593Smuzhiyun }
3034*4882a593Smuzhiyun
sock_init(void)3035*4882a593Smuzhiyun static int __init sock_init(void)
3036*4882a593Smuzhiyun {
3037*4882a593Smuzhiyun int err;
3038*4882a593Smuzhiyun /*
3039*4882a593Smuzhiyun * Initialize the network sysctl infrastructure.
3040*4882a593Smuzhiyun */
3041*4882a593Smuzhiyun err = net_sysctl_init();
3042*4882a593Smuzhiyun if (err)
3043*4882a593Smuzhiyun goto out;
3044*4882a593Smuzhiyun
3045*4882a593Smuzhiyun /*
3046*4882a593Smuzhiyun * Initialize skbuff SLAB cache
3047*4882a593Smuzhiyun */
3048*4882a593Smuzhiyun skb_init();
3049*4882a593Smuzhiyun
3050*4882a593Smuzhiyun /*
3051*4882a593Smuzhiyun * Initialize the protocols module.
3052*4882a593Smuzhiyun */
3053*4882a593Smuzhiyun
3054*4882a593Smuzhiyun init_inodecache();
3055*4882a593Smuzhiyun
3056*4882a593Smuzhiyun err = register_filesystem(&sock_fs_type);
3057*4882a593Smuzhiyun if (err)
3058*4882a593Smuzhiyun goto out;
3059*4882a593Smuzhiyun sock_mnt = kern_mount(&sock_fs_type);
3060*4882a593Smuzhiyun if (IS_ERR(sock_mnt)) {
3061*4882a593Smuzhiyun err = PTR_ERR(sock_mnt);
3062*4882a593Smuzhiyun goto out_mount;
3063*4882a593Smuzhiyun }
3064*4882a593Smuzhiyun
3065*4882a593Smuzhiyun /* The real protocol initialization is performed in later initcalls.
3066*4882a593Smuzhiyun */
3067*4882a593Smuzhiyun
3068*4882a593Smuzhiyun #ifdef CONFIG_NETFILTER
3069*4882a593Smuzhiyun err = netfilter_init();
3070*4882a593Smuzhiyun if (err)
3071*4882a593Smuzhiyun goto out;
3072*4882a593Smuzhiyun #endif
3073*4882a593Smuzhiyun
3074*4882a593Smuzhiyun ptp_classifier_init();
3075*4882a593Smuzhiyun
3076*4882a593Smuzhiyun out:
3077*4882a593Smuzhiyun return err;
3078*4882a593Smuzhiyun
3079*4882a593Smuzhiyun out_mount:
3080*4882a593Smuzhiyun unregister_filesystem(&sock_fs_type);
3081*4882a593Smuzhiyun goto out;
3082*4882a593Smuzhiyun }
3083*4882a593Smuzhiyun
3084*4882a593Smuzhiyun core_initcall(sock_init); /* early initcall */
3085*4882a593Smuzhiyun
3086*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
socket_seq_show(struct seq_file * seq)3087*4882a593Smuzhiyun void socket_seq_show(struct seq_file *seq)
3088*4882a593Smuzhiyun {
3089*4882a593Smuzhiyun seq_printf(seq, "sockets: used %d\n",
3090*4882a593Smuzhiyun sock_inuse_get(seq->private));
3091*4882a593Smuzhiyun }
3092*4882a593Smuzhiyun #endif /* CONFIG_PROC_FS */
3093*4882a593Smuzhiyun
3094*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
compat_dev_ifconf(struct net * net,struct compat_ifconf __user * uifc32)3095*4882a593Smuzhiyun static int compat_dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32)
3096*4882a593Smuzhiyun {
3097*4882a593Smuzhiyun struct compat_ifconf ifc32;
3098*4882a593Smuzhiyun struct ifconf ifc;
3099*4882a593Smuzhiyun int err;
3100*4882a593Smuzhiyun
3101*4882a593Smuzhiyun if (copy_from_user(&ifc32, uifc32, sizeof(struct compat_ifconf)))
3102*4882a593Smuzhiyun return -EFAULT;
3103*4882a593Smuzhiyun
3104*4882a593Smuzhiyun ifc.ifc_len = ifc32.ifc_len;
3105*4882a593Smuzhiyun ifc.ifc_req = compat_ptr(ifc32.ifcbuf);
3106*4882a593Smuzhiyun
3107*4882a593Smuzhiyun rtnl_lock();
3108*4882a593Smuzhiyun err = dev_ifconf(net, &ifc, sizeof(struct compat_ifreq));
3109*4882a593Smuzhiyun rtnl_unlock();
3110*4882a593Smuzhiyun if (err)
3111*4882a593Smuzhiyun return err;
3112*4882a593Smuzhiyun
3113*4882a593Smuzhiyun ifc32.ifc_len = ifc.ifc_len;
3114*4882a593Smuzhiyun if (copy_to_user(uifc32, &ifc32, sizeof(struct compat_ifconf)))
3115*4882a593Smuzhiyun return -EFAULT;
3116*4882a593Smuzhiyun
3117*4882a593Smuzhiyun return 0;
3118*4882a593Smuzhiyun }
3119*4882a593Smuzhiyun
compat_siocwandev(struct net * net,struct compat_ifreq __user * uifr32)3120*4882a593Smuzhiyun static int compat_siocwandev(struct net *net, struct compat_ifreq __user *uifr32)
3121*4882a593Smuzhiyun {
3122*4882a593Smuzhiyun compat_uptr_t uptr32;
3123*4882a593Smuzhiyun struct ifreq ifr;
3124*4882a593Smuzhiyun void __user *saved;
3125*4882a593Smuzhiyun int err;
3126*4882a593Smuzhiyun
3127*4882a593Smuzhiyun if (copy_from_user(&ifr, uifr32, sizeof(struct compat_ifreq)))
3128*4882a593Smuzhiyun return -EFAULT;
3129*4882a593Smuzhiyun
3130*4882a593Smuzhiyun if (get_user(uptr32, &uifr32->ifr_settings.ifs_ifsu))
3131*4882a593Smuzhiyun return -EFAULT;
3132*4882a593Smuzhiyun
3133*4882a593Smuzhiyun saved = ifr.ifr_settings.ifs_ifsu.raw_hdlc;
3134*4882a593Smuzhiyun ifr.ifr_settings.ifs_ifsu.raw_hdlc = compat_ptr(uptr32);
3135*4882a593Smuzhiyun
3136*4882a593Smuzhiyun err = dev_ioctl(net, SIOCWANDEV, &ifr, NULL);
3137*4882a593Smuzhiyun if (!err) {
3138*4882a593Smuzhiyun ifr.ifr_settings.ifs_ifsu.raw_hdlc = saved;
3139*4882a593Smuzhiyun if (copy_to_user(uifr32, &ifr, sizeof(struct compat_ifreq)))
3140*4882a593Smuzhiyun err = -EFAULT;
3141*4882a593Smuzhiyun }
3142*4882a593Smuzhiyun return err;
3143*4882a593Smuzhiyun }
3144*4882a593Smuzhiyun
3145*4882a593Smuzhiyun /* Handle ioctls that use ifreq::ifr_data and just need struct ifreq converted */
compat_ifr_data_ioctl(struct net * net,unsigned int cmd,struct compat_ifreq __user * u_ifreq32)3146*4882a593Smuzhiyun static int compat_ifr_data_ioctl(struct net *net, unsigned int cmd,
3147*4882a593Smuzhiyun struct compat_ifreq __user *u_ifreq32)
3148*4882a593Smuzhiyun {
3149*4882a593Smuzhiyun struct ifreq ifreq;
3150*4882a593Smuzhiyun u32 data32;
3151*4882a593Smuzhiyun
3152*4882a593Smuzhiyun if (!is_socket_ioctl_cmd(cmd))
3153*4882a593Smuzhiyun return -ENOTTY;
3154*4882a593Smuzhiyun if (copy_from_user(ifreq.ifr_name, u_ifreq32->ifr_name, IFNAMSIZ))
3155*4882a593Smuzhiyun return -EFAULT;
3156*4882a593Smuzhiyun if (get_user(data32, &u_ifreq32->ifr_data))
3157*4882a593Smuzhiyun return -EFAULT;
3158*4882a593Smuzhiyun ifreq.ifr_data = compat_ptr(data32);
3159*4882a593Smuzhiyun
3160*4882a593Smuzhiyun return dev_ioctl(net, cmd, &ifreq, NULL);
3161*4882a593Smuzhiyun }
3162*4882a593Smuzhiyun
compat_ifreq_ioctl(struct net * net,struct socket * sock,unsigned int cmd,struct compat_ifreq __user * uifr32)3163*4882a593Smuzhiyun static int compat_ifreq_ioctl(struct net *net, struct socket *sock,
3164*4882a593Smuzhiyun unsigned int cmd,
3165*4882a593Smuzhiyun struct compat_ifreq __user *uifr32)
3166*4882a593Smuzhiyun {
3167*4882a593Smuzhiyun struct ifreq __user *uifr;
3168*4882a593Smuzhiyun int err;
3169*4882a593Smuzhiyun
3170*4882a593Smuzhiyun /* Handle the fact that while struct ifreq has the same *layout* on
3171*4882a593Smuzhiyun * 32/64 for everything but ifreq::ifru_ifmap and ifreq::ifru_data,
3172*4882a593Smuzhiyun * which are handled elsewhere, it still has different *size* due to
3173*4882a593Smuzhiyun * ifreq::ifru_ifmap (which is 16 bytes on 32 bit, 24 bytes on 64-bit,
3174*4882a593Smuzhiyun * resulting in struct ifreq being 32 and 40 bytes respectively).
3175*4882a593Smuzhiyun * As a result, if the struct happens to be at the end of a page and
3176*4882a593Smuzhiyun * the next page isn't readable/writable, we get a fault. To prevent
3177*4882a593Smuzhiyun * that, copy back and forth to the full size.
3178*4882a593Smuzhiyun */
3179*4882a593Smuzhiyun
3180*4882a593Smuzhiyun uifr = compat_alloc_user_space(sizeof(*uifr));
3181*4882a593Smuzhiyun if (copy_in_user(uifr, uifr32, sizeof(*uifr32)))
3182*4882a593Smuzhiyun return -EFAULT;
3183*4882a593Smuzhiyun
3184*4882a593Smuzhiyun err = sock_do_ioctl(net, sock, cmd, (unsigned long)uifr);
3185*4882a593Smuzhiyun
3186*4882a593Smuzhiyun if (!err) {
3187*4882a593Smuzhiyun switch (cmd) {
3188*4882a593Smuzhiyun case SIOCGIFFLAGS:
3189*4882a593Smuzhiyun case SIOCGIFMETRIC:
3190*4882a593Smuzhiyun case SIOCGIFMTU:
3191*4882a593Smuzhiyun case SIOCGIFMEM:
3192*4882a593Smuzhiyun case SIOCGIFHWADDR:
3193*4882a593Smuzhiyun case SIOCGIFINDEX:
3194*4882a593Smuzhiyun case SIOCGIFADDR:
3195*4882a593Smuzhiyun case SIOCGIFBRDADDR:
3196*4882a593Smuzhiyun case SIOCGIFDSTADDR:
3197*4882a593Smuzhiyun case SIOCGIFNETMASK:
3198*4882a593Smuzhiyun case SIOCGIFPFLAGS:
3199*4882a593Smuzhiyun case SIOCGIFTXQLEN:
3200*4882a593Smuzhiyun case SIOCGMIIPHY:
3201*4882a593Smuzhiyun case SIOCGMIIREG:
3202*4882a593Smuzhiyun case SIOCGIFNAME:
3203*4882a593Smuzhiyun if (copy_in_user(uifr32, uifr, sizeof(*uifr32)))
3204*4882a593Smuzhiyun err = -EFAULT;
3205*4882a593Smuzhiyun break;
3206*4882a593Smuzhiyun }
3207*4882a593Smuzhiyun }
3208*4882a593Smuzhiyun return err;
3209*4882a593Smuzhiyun }
3210*4882a593Smuzhiyun
compat_sioc_ifmap(struct net * net,unsigned int cmd,struct compat_ifreq __user * uifr32)3211*4882a593Smuzhiyun static int compat_sioc_ifmap(struct net *net, unsigned int cmd,
3212*4882a593Smuzhiyun struct compat_ifreq __user *uifr32)
3213*4882a593Smuzhiyun {
3214*4882a593Smuzhiyun struct ifreq ifr;
3215*4882a593Smuzhiyun struct compat_ifmap __user *uifmap32;
3216*4882a593Smuzhiyun int err;
3217*4882a593Smuzhiyun
3218*4882a593Smuzhiyun uifmap32 = &uifr32->ifr_ifru.ifru_map;
3219*4882a593Smuzhiyun err = copy_from_user(&ifr, uifr32, sizeof(ifr.ifr_name));
3220*4882a593Smuzhiyun err |= get_user(ifr.ifr_map.mem_start, &uifmap32->mem_start);
3221*4882a593Smuzhiyun err |= get_user(ifr.ifr_map.mem_end, &uifmap32->mem_end);
3222*4882a593Smuzhiyun err |= get_user(ifr.ifr_map.base_addr, &uifmap32->base_addr);
3223*4882a593Smuzhiyun err |= get_user(ifr.ifr_map.irq, &uifmap32->irq);
3224*4882a593Smuzhiyun err |= get_user(ifr.ifr_map.dma, &uifmap32->dma);
3225*4882a593Smuzhiyun err |= get_user(ifr.ifr_map.port, &uifmap32->port);
3226*4882a593Smuzhiyun if (err)
3227*4882a593Smuzhiyun return -EFAULT;
3228*4882a593Smuzhiyun
3229*4882a593Smuzhiyun err = dev_ioctl(net, cmd, &ifr, NULL);
3230*4882a593Smuzhiyun
3231*4882a593Smuzhiyun if (cmd == SIOCGIFMAP && !err) {
3232*4882a593Smuzhiyun err = copy_to_user(uifr32, &ifr, sizeof(ifr.ifr_name));
3233*4882a593Smuzhiyun err |= put_user(ifr.ifr_map.mem_start, &uifmap32->mem_start);
3234*4882a593Smuzhiyun err |= put_user(ifr.ifr_map.mem_end, &uifmap32->mem_end);
3235*4882a593Smuzhiyun err |= put_user(ifr.ifr_map.base_addr, &uifmap32->base_addr);
3236*4882a593Smuzhiyun err |= put_user(ifr.ifr_map.irq, &uifmap32->irq);
3237*4882a593Smuzhiyun err |= put_user(ifr.ifr_map.dma, &uifmap32->dma);
3238*4882a593Smuzhiyun err |= put_user(ifr.ifr_map.port, &uifmap32->port);
3239*4882a593Smuzhiyun if (err)
3240*4882a593Smuzhiyun err = -EFAULT;
3241*4882a593Smuzhiyun }
3242*4882a593Smuzhiyun return err;
3243*4882a593Smuzhiyun }
3244*4882a593Smuzhiyun
3245*4882a593Smuzhiyun /* Since old style bridge ioctl's endup using SIOCDEVPRIVATE
3246*4882a593Smuzhiyun * for some operations; this forces use of the newer bridge-utils that
3247*4882a593Smuzhiyun * use compatible ioctls
3248*4882a593Smuzhiyun */
old_bridge_ioctl(compat_ulong_t __user * argp)3249*4882a593Smuzhiyun static int old_bridge_ioctl(compat_ulong_t __user *argp)
3250*4882a593Smuzhiyun {
3251*4882a593Smuzhiyun compat_ulong_t tmp;
3252*4882a593Smuzhiyun
3253*4882a593Smuzhiyun if (get_user(tmp, argp))
3254*4882a593Smuzhiyun return -EFAULT;
3255*4882a593Smuzhiyun if (tmp == BRCTL_GET_VERSION)
3256*4882a593Smuzhiyun return BRCTL_VERSION + 1;
3257*4882a593Smuzhiyun return -EINVAL;
3258*4882a593Smuzhiyun }
3259*4882a593Smuzhiyun
compat_sock_ioctl_trans(struct file * file,struct socket * sock,unsigned int cmd,unsigned long arg)3260*4882a593Smuzhiyun static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
3261*4882a593Smuzhiyun unsigned int cmd, unsigned long arg)
3262*4882a593Smuzhiyun {
3263*4882a593Smuzhiyun void __user *argp = compat_ptr(arg);
3264*4882a593Smuzhiyun struct sock *sk = sock->sk;
3265*4882a593Smuzhiyun struct net *net = sock_net(sk);
3266*4882a593Smuzhiyun
3267*4882a593Smuzhiyun if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15))
3268*4882a593Smuzhiyun return compat_ifr_data_ioctl(net, cmd, argp);
3269*4882a593Smuzhiyun
3270*4882a593Smuzhiyun switch (cmd) {
3271*4882a593Smuzhiyun case SIOCSIFBR:
3272*4882a593Smuzhiyun case SIOCGIFBR:
3273*4882a593Smuzhiyun return old_bridge_ioctl(argp);
3274*4882a593Smuzhiyun case SIOCGIFCONF:
3275*4882a593Smuzhiyun return compat_dev_ifconf(net, argp);
3276*4882a593Smuzhiyun case SIOCWANDEV:
3277*4882a593Smuzhiyun return compat_siocwandev(net, argp);
3278*4882a593Smuzhiyun case SIOCGIFMAP:
3279*4882a593Smuzhiyun case SIOCSIFMAP:
3280*4882a593Smuzhiyun return compat_sioc_ifmap(net, cmd, argp);
3281*4882a593Smuzhiyun case SIOCGSTAMP_OLD:
3282*4882a593Smuzhiyun case SIOCGSTAMPNS_OLD:
3283*4882a593Smuzhiyun if (!sock->ops->gettstamp)
3284*4882a593Smuzhiyun return -ENOIOCTLCMD;
3285*4882a593Smuzhiyun return sock->ops->gettstamp(sock, argp, cmd == SIOCGSTAMP_OLD,
3286*4882a593Smuzhiyun !COMPAT_USE_64BIT_TIME);
3287*4882a593Smuzhiyun
3288*4882a593Smuzhiyun case SIOCETHTOOL:
3289*4882a593Smuzhiyun case SIOCBONDSLAVEINFOQUERY:
3290*4882a593Smuzhiyun case SIOCBONDINFOQUERY:
3291*4882a593Smuzhiyun case SIOCSHWTSTAMP:
3292*4882a593Smuzhiyun case SIOCGHWTSTAMP:
3293*4882a593Smuzhiyun return compat_ifr_data_ioctl(net, cmd, argp);
3294*4882a593Smuzhiyun
3295*4882a593Smuzhiyun case FIOSETOWN:
3296*4882a593Smuzhiyun case SIOCSPGRP:
3297*4882a593Smuzhiyun case FIOGETOWN:
3298*4882a593Smuzhiyun case SIOCGPGRP:
3299*4882a593Smuzhiyun case SIOCBRADDBR:
3300*4882a593Smuzhiyun case SIOCBRDELBR:
3301*4882a593Smuzhiyun case SIOCGIFVLAN:
3302*4882a593Smuzhiyun case SIOCSIFVLAN:
3303*4882a593Smuzhiyun case SIOCADDDLCI:
3304*4882a593Smuzhiyun case SIOCDELDLCI:
3305*4882a593Smuzhiyun case SIOCGSKNS:
3306*4882a593Smuzhiyun case SIOCGSTAMP_NEW:
3307*4882a593Smuzhiyun case SIOCGSTAMPNS_NEW:
3308*4882a593Smuzhiyun return sock_ioctl(file, cmd, arg);
3309*4882a593Smuzhiyun
3310*4882a593Smuzhiyun case SIOCGIFFLAGS:
3311*4882a593Smuzhiyun case SIOCSIFFLAGS:
3312*4882a593Smuzhiyun case SIOCGIFMETRIC:
3313*4882a593Smuzhiyun case SIOCSIFMETRIC:
3314*4882a593Smuzhiyun case SIOCGIFMTU:
3315*4882a593Smuzhiyun case SIOCSIFMTU:
3316*4882a593Smuzhiyun case SIOCGIFMEM:
3317*4882a593Smuzhiyun case SIOCSIFMEM:
3318*4882a593Smuzhiyun case SIOCGIFHWADDR:
3319*4882a593Smuzhiyun case SIOCSIFHWADDR:
3320*4882a593Smuzhiyun case SIOCADDMULTI:
3321*4882a593Smuzhiyun case SIOCDELMULTI:
3322*4882a593Smuzhiyun case SIOCGIFINDEX:
3323*4882a593Smuzhiyun case SIOCGIFADDR:
3324*4882a593Smuzhiyun case SIOCSIFADDR:
3325*4882a593Smuzhiyun case SIOCSIFHWBROADCAST:
3326*4882a593Smuzhiyun case SIOCDIFADDR:
3327*4882a593Smuzhiyun case SIOCGIFBRDADDR:
3328*4882a593Smuzhiyun case SIOCSIFBRDADDR:
3329*4882a593Smuzhiyun case SIOCGIFDSTADDR:
3330*4882a593Smuzhiyun case SIOCSIFDSTADDR:
3331*4882a593Smuzhiyun case SIOCGIFNETMASK:
3332*4882a593Smuzhiyun case SIOCSIFNETMASK:
3333*4882a593Smuzhiyun case SIOCSIFPFLAGS:
3334*4882a593Smuzhiyun case SIOCGIFPFLAGS:
3335*4882a593Smuzhiyun case SIOCGIFTXQLEN:
3336*4882a593Smuzhiyun case SIOCSIFTXQLEN:
3337*4882a593Smuzhiyun case SIOCBRADDIF:
3338*4882a593Smuzhiyun case SIOCBRDELIF:
3339*4882a593Smuzhiyun case SIOCGIFNAME:
3340*4882a593Smuzhiyun case SIOCSIFNAME:
3341*4882a593Smuzhiyun case SIOCGMIIPHY:
3342*4882a593Smuzhiyun case SIOCGMIIREG:
3343*4882a593Smuzhiyun case SIOCSMIIREG:
3344*4882a593Smuzhiyun case SIOCBONDENSLAVE:
3345*4882a593Smuzhiyun case SIOCBONDRELEASE:
3346*4882a593Smuzhiyun case SIOCBONDSETHWADDR:
3347*4882a593Smuzhiyun case SIOCBONDCHANGEACTIVE:
3348*4882a593Smuzhiyun return compat_ifreq_ioctl(net, sock, cmd, argp);
3349*4882a593Smuzhiyun
3350*4882a593Smuzhiyun case SIOCSARP:
3351*4882a593Smuzhiyun case SIOCGARP:
3352*4882a593Smuzhiyun case SIOCDARP:
3353*4882a593Smuzhiyun case SIOCOUTQ:
3354*4882a593Smuzhiyun case SIOCOUTQNSD:
3355*4882a593Smuzhiyun case SIOCATMARK:
3356*4882a593Smuzhiyun return sock_do_ioctl(net, sock, cmd, arg);
3357*4882a593Smuzhiyun }
3358*4882a593Smuzhiyun
3359*4882a593Smuzhiyun return -ENOIOCTLCMD;
3360*4882a593Smuzhiyun }
3361*4882a593Smuzhiyun
compat_sock_ioctl(struct file * file,unsigned int cmd,unsigned long arg)3362*4882a593Smuzhiyun static long compat_sock_ioctl(struct file *file, unsigned int cmd,
3363*4882a593Smuzhiyun unsigned long arg)
3364*4882a593Smuzhiyun {
3365*4882a593Smuzhiyun struct socket *sock = file->private_data;
3366*4882a593Smuzhiyun int ret = -ENOIOCTLCMD;
3367*4882a593Smuzhiyun struct sock *sk;
3368*4882a593Smuzhiyun struct net *net;
3369*4882a593Smuzhiyun
3370*4882a593Smuzhiyun sk = sock->sk;
3371*4882a593Smuzhiyun net = sock_net(sk);
3372*4882a593Smuzhiyun
3373*4882a593Smuzhiyun if (sock->ops->compat_ioctl)
3374*4882a593Smuzhiyun ret = sock->ops->compat_ioctl(sock, cmd, arg);
3375*4882a593Smuzhiyun
3376*4882a593Smuzhiyun if (ret == -ENOIOCTLCMD &&
3377*4882a593Smuzhiyun (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST))
3378*4882a593Smuzhiyun ret = compat_wext_handle_ioctl(net, cmd, arg);
3379*4882a593Smuzhiyun
3380*4882a593Smuzhiyun if (ret == -ENOIOCTLCMD)
3381*4882a593Smuzhiyun ret = compat_sock_ioctl_trans(file, sock, cmd, arg);
3382*4882a593Smuzhiyun
3383*4882a593Smuzhiyun return ret;
3384*4882a593Smuzhiyun }
3385*4882a593Smuzhiyun #endif
3386*4882a593Smuzhiyun
3387*4882a593Smuzhiyun /**
3388*4882a593Smuzhiyun * kernel_bind - bind an address to a socket (kernel space)
3389*4882a593Smuzhiyun * @sock: socket
3390*4882a593Smuzhiyun * @addr: address
3391*4882a593Smuzhiyun * @addrlen: length of address
3392*4882a593Smuzhiyun *
3393*4882a593Smuzhiyun * Returns 0 or an error.
3394*4882a593Smuzhiyun */
3395*4882a593Smuzhiyun
kernel_bind(struct socket * sock,struct sockaddr * addr,int addrlen)3396*4882a593Smuzhiyun int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
3397*4882a593Smuzhiyun {
3398*4882a593Smuzhiyun return sock->ops->bind(sock, addr, addrlen);
3399*4882a593Smuzhiyun }
3400*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_bind);
3401*4882a593Smuzhiyun
3402*4882a593Smuzhiyun /**
3403*4882a593Smuzhiyun * kernel_listen - move socket to listening state (kernel space)
3404*4882a593Smuzhiyun * @sock: socket
3405*4882a593Smuzhiyun * @backlog: pending connections queue size
3406*4882a593Smuzhiyun *
3407*4882a593Smuzhiyun * Returns 0 or an error.
3408*4882a593Smuzhiyun */
3409*4882a593Smuzhiyun
kernel_listen(struct socket * sock,int backlog)3410*4882a593Smuzhiyun int kernel_listen(struct socket *sock, int backlog)
3411*4882a593Smuzhiyun {
3412*4882a593Smuzhiyun return sock->ops->listen(sock, backlog);
3413*4882a593Smuzhiyun }
3414*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_listen);
3415*4882a593Smuzhiyun
3416*4882a593Smuzhiyun /**
3417*4882a593Smuzhiyun * kernel_accept - accept a connection (kernel space)
3418*4882a593Smuzhiyun * @sock: listening socket
3419*4882a593Smuzhiyun * @newsock: new connected socket
3420*4882a593Smuzhiyun * @flags: flags
3421*4882a593Smuzhiyun *
3422*4882a593Smuzhiyun * @flags must be SOCK_CLOEXEC, SOCK_NONBLOCK or 0.
3423*4882a593Smuzhiyun * If it fails, @newsock is guaranteed to be %NULL.
3424*4882a593Smuzhiyun * Returns 0 or an error.
3425*4882a593Smuzhiyun */
3426*4882a593Smuzhiyun
kernel_accept(struct socket * sock,struct socket ** newsock,int flags)3427*4882a593Smuzhiyun int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
3428*4882a593Smuzhiyun {
3429*4882a593Smuzhiyun struct sock *sk = sock->sk;
3430*4882a593Smuzhiyun int err;
3431*4882a593Smuzhiyun
3432*4882a593Smuzhiyun err = sock_create_lite(sk->sk_family, sk->sk_type, sk->sk_protocol,
3433*4882a593Smuzhiyun newsock);
3434*4882a593Smuzhiyun if (err < 0)
3435*4882a593Smuzhiyun goto done;
3436*4882a593Smuzhiyun
3437*4882a593Smuzhiyun err = sock->ops->accept(sock, *newsock, flags, true);
3438*4882a593Smuzhiyun if (err < 0) {
3439*4882a593Smuzhiyun sock_release(*newsock);
3440*4882a593Smuzhiyun *newsock = NULL;
3441*4882a593Smuzhiyun goto done;
3442*4882a593Smuzhiyun }
3443*4882a593Smuzhiyun
3444*4882a593Smuzhiyun (*newsock)->ops = sock->ops;
3445*4882a593Smuzhiyun __module_get((*newsock)->ops->owner);
3446*4882a593Smuzhiyun
3447*4882a593Smuzhiyun done:
3448*4882a593Smuzhiyun return err;
3449*4882a593Smuzhiyun }
3450*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_accept);
3451*4882a593Smuzhiyun
3452*4882a593Smuzhiyun /**
3453*4882a593Smuzhiyun * kernel_connect - connect a socket (kernel space)
3454*4882a593Smuzhiyun * @sock: socket
3455*4882a593Smuzhiyun * @addr: address
3456*4882a593Smuzhiyun * @addrlen: address length
3457*4882a593Smuzhiyun * @flags: flags (O_NONBLOCK, ...)
3458*4882a593Smuzhiyun *
3459*4882a593Smuzhiyun * For datagram sockets, @addr is the addres to which datagrams are sent
3460*4882a593Smuzhiyun * by default, and the only address from which datagrams are received.
3461*4882a593Smuzhiyun * For stream sockets, attempts to connect to @addr.
3462*4882a593Smuzhiyun * Returns 0 or an error code.
3463*4882a593Smuzhiyun */
3464*4882a593Smuzhiyun
kernel_connect(struct socket * sock,struct sockaddr * addr,int addrlen,int flags)3465*4882a593Smuzhiyun int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
3466*4882a593Smuzhiyun int flags)
3467*4882a593Smuzhiyun {
3468*4882a593Smuzhiyun return sock->ops->connect(sock, addr, addrlen, flags);
3469*4882a593Smuzhiyun }
3470*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_connect);
3471*4882a593Smuzhiyun
3472*4882a593Smuzhiyun /**
3473*4882a593Smuzhiyun * kernel_getsockname - get the address which the socket is bound (kernel space)
3474*4882a593Smuzhiyun * @sock: socket
3475*4882a593Smuzhiyun * @addr: address holder
3476*4882a593Smuzhiyun *
3477*4882a593Smuzhiyun * Fills the @addr pointer with the address which the socket is bound.
3478*4882a593Smuzhiyun * Returns 0 or an error code.
3479*4882a593Smuzhiyun */
3480*4882a593Smuzhiyun
kernel_getsockname(struct socket * sock,struct sockaddr * addr)3481*4882a593Smuzhiyun int kernel_getsockname(struct socket *sock, struct sockaddr *addr)
3482*4882a593Smuzhiyun {
3483*4882a593Smuzhiyun return sock->ops->getname(sock, addr, 0);
3484*4882a593Smuzhiyun }
3485*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_getsockname);
3486*4882a593Smuzhiyun
3487*4882a593Smuzhiyun /**
3488*4882a593Smuzhiyun * kernel_getpeername - get the address which the socket is connected (kernel space)
3489*4882a593Smuzhiyun * @sock: socket
3490*4882a593Smuzhiyun * @addr: address holder
3491*4882a593Smuzhiyun *
3492*4882a593Smuzhiyun * Fills the @addr pointer with the address which the socket is connected.
3493*4882a593Smuzhiyun * Returns 0 or an error code.
3494*4882a593Smuzhiyun */
3495*4882a593Smuzhiyun
kernel_getpeername(struct socket * sock,struct sockaddr * addr)3496*4882a593Smuzhiyun int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
3497*4882a593Smuzhiyun {
3498*4882a593Smuzhiyun return sock->ops->getname(sock, addr, 1);
3499*4882a593Smuzhiyun }
3500*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_getpeername);
3501*4882a593Smuzhiyun
3502*4882a593Smuzhiyun /**
3503*4882a593Smuzhiyun * kernel_sendpage - send a &page through a socket (kernel space)
3504*4882a593Smuzhiyun * @sock: socket
3505*4882a593Smuzhiyun * @page: page
3506*4882a593Smuzhiyun * @offset: page offset
3507*4882a593Smuzhiyun * @size: total size in bytes
3508*4882a593Smuzhiyun * @flags: flags (MSG_DONTWAIT, ...)
3509*4882a593Smuzhiyun *
3510*4882a593Smuzhiyun * Returns the total amount sent in bytes or an error.
3511*4882a593Smuzhiyun */
3512*4882a593Smuzhiyun
kernel_sendpage(struct socket * sock,struct page * page,int offset,size_t size,int flags)3513*4882a593Smuzhiyun int kernel_sendpage(struct socket *sock, struct page *page, int offset,
3514*4882a593Smuzhiyun size_t size, int flags)
3515*4882a593Smuzhiyun {
3516*4882a593Smuzhiyun if (sock->ops->sendpage) {
3517*4882a593Smuzhiyun /* Warn in case the improper page to zero-copy send */
3518*4882a593Smuzhiyun WARN_ONCE(!sendpage_ok(page), "improper page for zero-copy send");
3519*4882a593Smuzhiyun return sock->ops->sendpage(sock, page, offset, size, flags);
3520*4882a593Smuzhiyun }
3521*4882a593Smuzhiyun return sock_no_sendpage(sock, page, offset, size, flags);
3522*4882a593Smuzhiyun }
3523*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_sendpage);
3524*4882a593Smuzhiyun
3525*4882a593Smuzhiyun /**
3526*4882a593Smuzhiyun * kernel_sendpage_locked - send a &page through the locked sock (kernel space)
3527*4882a593Smuzhiyun * @sk: sock
3528*4882a593Smuzhiyun * @page: page
3529*4882a593Smuzhiyun * @offset: page offset
3530*4882a593Smuzhiyun * @size: total size in bytes
3531*4882a593Smuzhiyun * @flags: flags (MSG_DONTWAIT, ...)
3532*4882a593Smuzhiyun *
3533*4882a593Smuzhiyun * Returns the total amount sent in bytes or an error.
3534*4882a593Smuzhiyun * Caller must hold @sk.
3535*4882a593Smuzhiyun */
3536*4882a593Smuzhiyun
kernel_sendpage_locked(struct sock * sk,struct page * page,int offset,size_t size,int flags)3537*4882a593Smuzhiyun int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
3538*4882a593Smuzhiyun size_t size, int flags)
3539*4882a593Smuzhiyun {
3540*4882a593Smuzhiyun struct socket *sock = sk->sk_socket;
3541*4882a593Smuzhiyun
3542*4882a593Smuzhiyun if (sock->ops->sendpage_locked)
3543*4882a593Smuzhiyun return sock->ops->sendpage_locked(sk, page, offset, size,
3544*4882a593Smuzhiyun flags);
3545*4882a593Smuzhiyun
3546*4882a593Smuzhiyun return sock_no_sendpage_locked(sk, page, offset, size, flags);
3547*4882a593Smuzhiyun }
3548*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_sendpage_locked);
3549*4882a593Smuzhiyun
3550*4882a593Smuzhiyun /**
3551*4882a593Smuzhiyun * kernel_sock_shutdown - shut down part of a full-duplex connection (kernel space)
3552*4882a593Smuzhiyun * @sock: socket
3553*4882a593Smuzhiyun * @how: connection part
3554*4882a593Smuzhiyun *
3555*4882a593Smuzhiyun * Returns 0 or an error.
3556*4882a593Smuzhiyun */
3557*4882a593Smuzhiyun
kernel_sock_shutdown(struct socket * sock,enum sock_shutdown_cmd how)3558*4882a593Smuzhiyun int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how)
3559*4882a593Smuzhiyun {
3560*4882a593Smuzhiyun return sock->ops->shutdown(sock, how);
3561*4882a593Smuzhiyun }
3562*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_sock_shutdown);
3563*4882a593Smuzhiyun
3564*4882a593Smuzhiyun /**
3565*4882a593Smuzhiyun * kernel_sock_ip_overhead - returns the IP overhead imposed by a socket
3566*4882a593Smuzhiyun * @sk: socket
3567*4882a593Smuzhiyun *
3568*4882a593Smuzhiyun * This routine returns the IP overhead imposed by a socket i.e.
3569*4882a593Smuzhiyun * the length of the underlying IP header, depending on whether
3570*4882a593Smuzhiyun * this is an IPv4 or IPv6 socket and the length from IP options turned
3571*4882a593Smuzhiyun * on at the socket. Assumes that the caller has a lock on the socket.
3572*4882a593Smuzhiyun */
3573*4882a593Smuzhiyun
kernel_sock_ip_overhead(struct sock * sk)3574*4882a593Smuzhiyun u32 kernel_sock_ip_overhead(struct sock *sk)
3575*4882a593Smuzhiyun {
3576*4882a593Smuzhiyun struct inet_sock *inet;
3577*4882a593Smuzhiyun struct ip_options_rcu *opt;
3578*4882a593Smuzhiyun u32 overhead = 0;
3579*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
3580*4882a593Smuzhiyun struct ipv6_pinfo *np;
3581*4882a593Smuzhiyun struct ipv6_txoptions *optv6 = NULL;
3582*4882a593Smuzhiyun #endif /* IS_ENABLED(CONFIG_IPV6) */
3583*4882a593Smuzhiyun
3584*4882a593Smuzhiyun if (!sk)
3585*4882a593Smuzhiyun return overhead;
3586*4882a593Smuzhiyun
3587*4882a593Smuzhiyun switch (sk->sk_family) {
3588*4882a593Smuzhiyun case AF_INET:
3589*4882a593Smuzhiyun inet = inet_sk(sk);
3590*4882a593Smuzhiyun overhead += sizeof(struct iphdr);
3591*4882a593Smuzhiyun opt = rcu_dereference_protected(inet->inet_opt,
3592*4882a593Smuzhiyun sock_owned_by_user(sk));
3593*4882a593Smuzhiyun if (opt)
3594*4882a593Smuzhiyun overhead += opt->opt.optlen;
3595*4882a593Smuzhiyun return overhead;
3596*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
3597*4882a593Smuzhiyun case AF_INET6:
3598*4882a593Smuzhiyun np = inet6_sk(sk);
3599*4882a593Smuzhiyun overhead += sizeof(struct ipv6hdr);
3600*4882a593Smuzhiyun if (np)
3601*4882a593Smuzhiyun optv6 = rcu_dereference_protected(np->opt,
3602*4882a593Smuzhiyun sock_owned_by_user(sk));
3603*4882a593Smuzhiyun if (optv6)
3604*4882a593Smuzhiyun overhead += (optv6->opt_flen + optv6->opt_nflen);
3605*4882a593Smuzhiyun return overhead;
3606*4882a593Smuzhiyun #endif /* IS_ENABLED(CONFIG_IPV6) */
3607*4882a593Smuzhiyun default: /* Returns 0 overhead if the socket is not ipv4 or ipv6 */
3608*4882a593Smuzhiyun return overhead;
3609*4882a593Smuzhiyun }
3610*4882a593Smuzhiyun }
3611*4882a593Smuzhiyun EXPORT_SYMBOL(kernel_sock_ip_overhead);
3612