TIPC: Updated topology subscription protocol according to latest spec
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / socket.c
CommitLineData
1da177e4
LT
1/*
2 * NET An implementation of the SOCKET network access protocol.
3 *
4 * Version: @(#)socket.c 1.1.93 18/02/95
5 *
6 * Authors: Orest Zborowski, <obz@Kodak.COM>
02c30a84 7 * Ross Biro
1da177e4
LT
8 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
9 *
10 * Fixes:
11 * Anonymous : NOTSOCK/BADF cleanup. Error fix in
12 * shutdown()
13 * Alan Cox : verify_area() fixes
14 * Alan Cox : Removed DDI
15 * Jonathan Kamens : SOCK_DGRAM reconnect bug
16 * Alan Cox : Moved a load of checks to the very
17 * top level.
18 * Alan Cox : Move address structures to/from user
19 * mode above the protocol layers.
20 * Rob Janssen : Allow 0 length sends.
21 * Alan Cox : Asynchronous I/O support (cribbed from the
22 * tty drivers).
23 * Niibe Yutaka : Asynchronous I/O for writes (4.4BSD style)
24 * Jeff Uphoff : Made max number of sockets command-line
25 * configurable.
26 * Matti Aarnio : Made the number of sockets dynamic,
27 * to be allocated when needed, and mr.
28 * Uphoff's max is used as max to be
29 * allowed to allocate.
30 * Linus : Argh. removed all the socket allocation
31 * altogether: it's in the inode now.
32 * Alan Cox : Made sock_alloc()/sock_release() public
33 * for NetROM and future kernel nfsd type
34 * stuff.
35 * Alan Cox : sendmsg/recvmsg basics.
36 * Tom Dyas : Export net symbols.
37 * Marcin Dalecki : Fixed problems with CONFIG_NET="n".
38 * Alan Cox : Added thread locking to sys_* calls
39 * for sockets. May have errors at the
40 * moment.
41 * Kevin Buhr : Fixed the dumb errors in the above.
42 * Andi Kleen : Some small cleanups, optimizations,
43 * and fixed a copy_from_user() bug.
44 * Tigran Aivazian : sys_send(args) calls sys_sendto(args, NULL, 0)
89bddce5 45 * Tigran Aivazian : Made listen(2) backlog sanity checks
1da177e4
LT
46 * protocol-independent
47 *
48 *
49 * This program is free software; you can redistribute it and/or
50 * modify it under the terms of the GNU General Public License
51 * as published by the Free Software Foundation; either version
52 * 2 of the License, or (at your option) any later version.
53 *
54 *
55 * This module is effectively the top level interface to the BSD socket
89bddce5 56 * paradigm.
1da177e4
LT
57 *
58 * Based upon Swansea University Computer Society NET3.039
59 */
60
1da177e4 61#include <linux/mm.h>
1da177e4
LT
62#include <linux/socket.h>
63#include <linux/file.h>
64#include <linux/net.h>
65#include <linux/interrupt.h>
aaca0bdc 66#include <linux/thread_info.h>
55737fda 67#include <linux/rcupdate.h>
1da177e4
LT
68#include <linux/netdevice.h>
69#include <linux/proc_fs.h>
70#include <linux/seq_file.h>
4a3e2f71 71#include <linux/mutex.h>
1da177e4
LT
72#include <linux/wanrouter.h>
73#include <linux/if_bridge.h>
20380731
ACM
74#include <linux/if_frad.h>
75#include <linux/if_vlan.h>
1da177e4
LT
76#include <linux/init.h>
77#include <linux/poll.h>
78#include <linux/cache.h>
79#include <linux/module.h>
80#include <linux/highmem.h>
1da177e4
LT
81#include <linux/mount.h>
82#include <linux/security.h>
83#include <linux/syscalls.h>
84#include <linux/compat.h>
85#include <linux/kmod.h>
3ec3b2fb 86#include <linux/audit.h>
d86b5e0e 87#include <linux/wireless.h>
1b8d7ae4 88#include <linux/nsproxy.h>
1fd7317d 89#include <linux/magic.h>
1da177e4
LT
90
91#include <asm/uaccess.h>
92#include <asm/unistd.h>
93
94#include <net/compat.h>
87de87d5 95#include <net/wext.h>
1da177e4
LT
96
97#include <net/sock.h>
98#include <linux/netfilter.h>
99
6b96018b
AB
100#include <linux/if_tun.h>
101#include <linux/ipv6_route.h>
102#include <linux/route.h>
6b96018b
AB
103#include <linux/sockios.h>
104#include <linux/atalk.h>
105
1da177e4 106static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
027445c3
BP
107static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
108 unsigned long nr_segs, loff_t pos);
109static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov,
110 unsigned long nr_segs, loff_t pos);
89bddce5 111static int sock_mmap(struct file *file, struct vm_area_struct *vma);
1da177e4
LT
112
113static int sock_close(struct inode *inode, struct file *file);
114static unsigned int sock_poll(struct file *file,
115 struct poll_table_struct *wait);
89bddce5 116static long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
89bbfc95
SP
117#ifdef CONFIG_COMPAT
118static long compat_sock_ioctl(struct file *file,
89bddce5 119 unsigned int cmd, unsigned long arg);
89bbfc95 120#endif
1da177e4 121static int sock_fasync(int fd, struct file *filp, int on);
1da177e4
LT
122static ssize_t sock_sendpage(struct file *file, struct page *page,
123 int offset, size_t size, loff_t *ppos, int more);
9c55e01c
JA
124static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
125 struct pipe_inode_info *pipe, size_t len,
126 unsigned int flags);
1da177e4 127
1da177e4
LT
128/*
129 * Socket files have a set of 'special' operations as well as the generic file ones. These don't appear
130 * in the operation structures but are done directly via the socketcall() multiplexor.
131 */
132
da7071d7 133static const struct file_operations socket_file_ops = {
1da177e4
LT
134 .owner = THIS_MODULE,
135 .llseek = no_llseek,
136 .aio_read = sock_aio_read,
137 .aio_write = sock_aio_write,
138 .poll = sock_poll,
139 .unlocked_ioctl = sock_ioctl,
89bbfc95
SP
140#ifdef CONFIG_COMPAT
141 .compat_ioctl = compat_sock_ioctl,
142#endif
1da177e4
LT
143 .mmap = sock_mmap,
144 .open = sock_no_open, /* special open code to disallow open via /proc */
145 .release = sock_close,
146 .fasync = sock_fasync,
5274f052
JA
147 .sendpage = sock_sendpage,
148 .splice_write = generic_splice_sendpage,
9c55e01c 149 .splice_read = sock_splice_read,
1da177e4
LT
150};
151
152/*
153 * The protocol list. Each protocol is registered in here.
154 */
155
1da177e4 156static DEFINE_SPINLOCK(net_family_lock);
f0fd27d4 157static const struct net_proto_family *net_families[NPROTO] __read_mostly;
1da177e4 158
1da177e4
LT
159/*
160 * Statistics counters of the socket lists
161 */
162
163static DEFINE_PER_CPU(int, sockets_in_use) = 0;
164
165/*
89bddce5
SH
166 * Support routines.
167 * Move socket addresses back and forth across the kernel/user
168 * divide and look after the messy bits.
1da177e4
LT
169 */
170
89bddce5 171#define MAX_SOCK_ADDR 128 /* 108 for Unix domain -
1da177e4
LT
172 16 for IP, 16 for IPX,
173 24 for IPv6,
89bddce5 174 about 80 for AX.25
1da177e4
LT
175 must be at least one bigger than
176 the AF_UNIX size (see net/unix/af_unix.c
89bddce5 177 :unix_mkname()).
1da177e4 178 */
89bddce5 179
1da177e4
LT
180/**
181 * move_addr_to_kernel - copy a socket address into kernel space
182 * @uaddr: Address in user space
183 * @kaddr: Address in kernel space
184 * @ulen: Length in user space
185 *
186 * The address is copied into kernel space. If the provided address is
187 * too long an error code of -EINVAL is returned. If the copy gives
188 * invalid addresses -EFAULT is returned. On a success 0 is returned.
189 */
190
230b1839 191int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr)
1da177e4 192{
230b1839 193 if (ulen < 0 || ulen > sizeof(struct sockaddr_storage))
1da177e4 194 return -EINVAL;
89bddce5 195 if (ulen == 0)
1da177e4 196 return 0;
89bddce5 197 if (copy_from_user(kaddr, uaddr, ulen))
1da177e4 198 return -EFAULT;
3ec3b2fb 199 return audit_sockaddr(ulen, kaddr);
1da177e4
LT
200}
201
202/**
203 * move_addr_to_user - copy an address to user space
204 * @kaddr: kernel space address
205 * @klen: length of address in kernel
206 * @uaddr: user space address
207 * @ulen: pointer to user length field
208 *
209 * The value pointed to by ulen on entry is the buffer length available.
210 * This is overwritten with the buffer space used. -EINVAL is returned
211 * if an overlong buffer is specified or a negative buffer size. -EFAULT
212 * is returned if either the buffer or the length field are not
213 * accessible.
214 * After copying the data up to the limit the user specifies, the true
215 * length of the data is written over the length limit the user
216 * specified. Zero is returned for a success.
217 */
89bddce5 218
230b1839 219int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr,
89bddce5 220 int __user *ulen)
1da177e4
LT
221{
222 int err;
223 int len;
224
89bddce5
SH
225 err = get_user(len, ulen);
226 if (err)
1da177e4 227 return err;
89bddce5
SH
228 if (len > klen)
229 len = klen;
230b1839 230 if (len < 0 || len > sizeof(struct sockaddr_storage))
1da177e4 231 return -EINVAL;
89bddce5 232 if (len) {
d6fe3945
SG
233 if (audit_sockaddr(klen, kaddr))
234 return -ENOMEM;
89bddce5 235 if (copy_to_user(uaddr, kaddr, len))
1da177e4
LT
236 return -EFAULT;
237 }
238 /*
89bddce5
SH
239 * "fromlen shall refer to the value before truncation.."
240 * 1003.1g
1da177e4
LT
241 */
242 return __put_user(klen, ulen);
243}
244
e18b890b 245static struct kmem_cache *sock_inode_cachep __read_mostly;
1da177e4
LT
246
247static struct inode *sock_alloc_inode(struct super_block *sb)
248{
249 struct socket_alloc *ei;
89bddce5 250
e94b1766 251 ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL);
1da177e4
LT
252 if (!ei)
253 return NULL;
254 init_waitqueue_head(&ei->socket.wait);
89bddce5 255
1da177e4
LT
256 ei->socket.fasync_list = NULL;
257 ei->socket.state = SS_UNCONNECTED;
258 ei->socket.flags = 0;
259 ei->socket.ops = NULL;
260 ei->socket.sk = NULL;
261 ei->socket.file = NULL;
1da177e4
LT
262
263 return &ei->vfs_inode;
264}
265
266static void sock_destroy_inode(struct inode *inode)
267{
268 kmem_cache_free(sock_inode_cachep,
269 container_of(inode, struct socket_alloc, vfs_inode));
270}
271
51cc5068 272static void init_once(void *foo)
1da177e4 273{
89bddce5 274 struct socket_alloc *ei = (struct socket_alloc *)foo;
1da177e4 275
a35afb83 276 inode_init_once(&ei->vfs_inode);
1da177e4 277}
89bddce5 278
1da177e4
LT
279static int init_inodecache(void)
280{
281 sock_inode_cachep = kmem_cache_create("sock_inode_cache",
89bddce5
SH
282 sizeof(struct socket_alloc),
283 0,
284 (SLAB_HWCACHE_ALIGN |
285 SLAB_RECLAIM_ACCOUNT |
286 SLAB_MEM_SPREAD),
20c2df83 287 init_once);
1da177e4
LT
288 if (sock_inode_cachep == NULL)
289 return -ENOMEM;
290 return 0;
291}
292
b87221de 293static const struct super_operations sockfs_ops = {
1da177e4
LT
294 .alloc_inode = sock_alloc_inode,
295 .destroy_inode =sock_destroy_inode,
296 .statfs = simple_statfs,
297};
298
454e2398 299static int sockfs_get_sb(struct file_system_type *fs_type,
89bddce5
SH
300 int flags, const char *dev_name, void *data,
301 struct vfsmount *mnt)
1da177e4 302{
454e2398
DH
303 return get_sb_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC,
304 mnt);
1da177e4
LT
305}
306
ba89966c 307static struct vfsmount *sock_mnt __read_mostly;
1da177e4
LT
308
309static struct file_system_type sock_fs_type = {
310 .name = "sockfs",
311 .get_sb = sockfs_get_sb,
312 .kill_sb = kill_anon_super,
313};
89bddce5 314
c23fbb6b
ED
315/*
316 * sockfs_dname() is called from d_path().
317 */
318static char *sockfs_dname(struct dentry *dentry, char *buffer, int buflen)
319{
320 return dynamic_dname(dentry, buffer, buflen, "socket:[%lu]",
321 dentry->d_inode->i_ino);
322}
323
3ba13d17 324static const struct dentry_operations sockfs_dentry_operations = {
c23fbb6b 325 .d_dname = sockfs_dname,
1da177e4
LT
326};
327
328/*
329 * Obtains the first available file descriptor and sets it up for use.
330 *
39d8c1b6
DM
331 * These functions create file structures and maps them to fd space
332 * of the current process. On success it returns file descriptor
1da177e4
LT
333 * and file struct implicitly stored in sock->file.
334 * Note that another thread may close file descriptor before we return
335 * from this function. We use the fact that now we do not refer
336 * to socket after mapping. If one day we will need it, this
337 * function will increment ref. count on file by 1.
338 *
339 * In any case returned fd MAY BE not valid!
340 * This race condition is unavoidable
341 * with shared fd spaces, we cannot solve it inside kernel,
342 * but we take care of internal coherence yet.
343 */
344
7cbe66b6 345static int sock_alloc_file(struct socket *sock, struct file **f, int flags)
1da177e4 346{
7cbe66b6 347 struct qstr name = { .name = "" };
2c48b9c4 348 struct path path;
7cbe66b6 349 struct file *file;
1da177e4 350 int fd;
1da177e4 351
a677a039 352 fd = get_unused_fd_flags(flags);
7cbe66b6
AV
353 if (unlikely(fd < 0))
354 return fd;
1da177e4 355
2c48b9c4
AV
356 path.dentry = d_alloc(sock_mnt->mnt_sb->s_root, &name);
357 if (unlikely(!path.dentry)) {
7cbe66b6 358 put_unused_fd(fd);
39d8c1b6 359 return -ENOMEM;
7cbe66b6 360 }
2c48b9c4 361 path.mnt = mntget(sock_mnt);
39d8c1b6 362
2c48b9c4 363 path.dentry->d_op = &sockfs_dentry_operations;
2c48b9c4 364 d_instantiate(path.dentry, SOCK_INODE(sock));
cc3808f8 365 SOCK_INODE(sock)->i_fop = &socket_file_ops;
39d8c1b6 366
2c48b9c4 367 file = alloc_file(&path, FMODE_READ | FMODE_WRITE,
ce8d2cdf 368 &socket_file_ops);
cc3808f8
AV
369 if (unlikely(!file)) {
370 /* drop dentry, keep inode */
371 atomic_inc(&path.dentry->d_inode->i_count);
2c48b9c4 372 path_put(&path);
cc3808f8
AV
373 put_unused_fd(fd);
374 return -ENFILE;
375 }
376
377 sock->file = file;
77d27200 378 file->f_flags = O_RDWR | (flags & O_NONBLOCK);
39d8c1b6
DM
379 file->f_pos = 0;
380 file->private_data = sock;
1da177e4 381
7cbe66b6
AV
382 *f = file;
383 return fd;
39d8c1b6
DM
384}
385
a677a039 386int sock_map_fd(struct socket *sock, int flags)
39d8c1b6
DM
387{
388 struct file *newfile;
7cbe66b6 389 int fd = sock_alloc_file(sock, &newfile, flags);
39d8c1b6 390
7cbe66b6 391 if (likely(fd >= 0))
39d8c1b6 392 fd_install(fd, newfile);
7cbe66b6 393
1da177e4
LT
394 return fd;
395}
396
6cb153ca
BL
397static struct socket *sock_from_file(struct file *file, int *err)
398{
6cb153ca
BL
399 if (file->f_op == &socket_file_ops)
400 return file->private_data; /* set in sock_map_fd */
401
23bb80d2
ED
402 *err = -ENOTSOCK;
403 return NULL;
6cb153ca
BL
404}
405
1da177e4
LT
406/**
407 * sockfd_lookup - Go from a file number to its socket slot
408 * @fd: file handle
409 * @err: pointer to an error code return
410 *
411 * The file handle passed in is locked and the socket it is bound
412 * too is returned. If an error occurs the err pointer is overwritten
413 * with a negative errno code and NULL is returned. The function checks
414 * for both invalid handles and passing a handle which is not a socket.
415 *
416 * On a success the socket object pointer is returned.
417 */
418
419struct socket *sockfd_lookup(int fd, int *err)
420{
421 struct file *file;
1da177e4
LT
422 struct socket *sock;
423
89bddce5
SH
424 file = fget(fd);
425 if (!file) {
1da177e4
LT
426 *err = -EBADF;
427 return NULL;
428 }
89bddce5 429
6cb153ca
BL
430 sock = sock_from_file(file, err);
431 if (!sock)
1da177e4 432 fput(file);
6cb153ca
BL
433 return sock;
434}
1da177e4 435
6cb153ca
BL
436static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed)
437{
438 struct file *file;
439 struct socket *sock;
440
3672558c 441 *err = -EBADF;
6cb153ca
BL
442 file = fget_light(fd, fput_needed);
443 if (file) {
444 sock = sock_from_file(file, err);
445 if (sock)
446 return sock;
447 fput_light(file, *fput_needed);
1da177e4 448 }
6cb153ca 449 return NULL;
1da177e4
LT
450}
451
452/**
453 * sock_alloc - allocate a socket
89bddce5 454 *
1da177e4
LT
455 * Allocate a new inode and socket object. The two are bound together
456 * and initialised. The socket is then returned. If we are out of inodes
457 * NULL is returned.
458 */
459
460static struct socket *sock_alloc(void)
461{
89bddce5
SH
462 struct inode *inode;
463 struct socket *sock;
1da177e4
LT
464
465 inode = new_inode(sock_mnt->mnt_sb);
466 if (!inode)
467 return NULL;
468
469 sock = SOCKET_I(inode);
470
29a020d3 471 kmemcheck_annotate_bitfield(sock, type);
89bddce5 472 inode->i_mode = S_IFSOCK | S_IRWXUGO;
8192b0c4
DH
473 inode->i_uid = current_fsuid();
474 inode->i_gid = current_fsgid();
1da177e4 475
4e69489a 476 percpu_add(sockets_in_use, 1);
1da177e4
LT
477 return sock;
478}
479
480/*
481 * In theory you can't get an open on this inode, but /proc provides
482 * a back door. Remember to keep it shut otherwise you'll let the
483 * creepy crawlies in.
484 */
89bddce5 485
1da177e4
LT
486static int sock_no_open(struct inode *irrelevant, struct file *dontcare)
487{
488 return -ENXIO;
489}
490
4b6f5d20 491const struct file_operations bad_sock_fops = {
1da177e4
LT
492 .owner = THIS_MODULE,
493 .open = sock_no_open,
494};
495
496/**
497 * sock_release - close a socket
498 * @sock: socket to close
499 *
500 * The socket is released from the protocol stack if it has a release
501 * callback, and the inode is then released if the socket is bound to
89bddce5 502 * an inode not a file.
1da177e4 503 */
89bddce5 504
1da177e4
LT
505void sock_release(struct socket *sock)
506{
507 if (sock->ops) {
508 struct module *owner = sock->ops->owner;
509
510 sock->ops->release(sock);
511 sock->ops = NULL;
512 module_put(owner);
513 }
514
515 if (sock->fasync_list)
516 printk(KERN_ERR "sock_release: fasync list not empty!\n");
517
4e69489a 518 percpu_sub(sockets_in_use, 1);
1da177e4
LT
519 if (!sock->file) {
520 iput(SOCK_INODE(sock));
521 return;
522 }
89bddce5 523 sock->file = NULL;
1da177e4
LT
524}
525
20d49473
PO
526int sock_tx_timestamp(struct msghdr *msg, struct sock *sk,
527 union skb_shared_tx *shtx)
528{
529 shtx->flags = 0;
530 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE))
531 shtx->hardware = 1;
532 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE))
533 shtx->software = 1;
534 return 0;
535}
536EXPORT_SYMBOL(sock_tx_timestamp);
537
89bddce5 538static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock,
1da177e4
LT
539 struct msghdr *msg, size_t size)
540{
541 struct sock_iocb *si = kiocb_to_siocb(iocb);
542 int err;
543
544 si->sock = sock;
545 si->scm = NULL;
546 si->msg = msg;
547 si->size = size;
548
549 err = security_socket_sendmsg(sock, msg, size);
550 if (err)
551 return err;
552
553 return sock->ops->sendmsg(iocb, sock, msg, size);
554}
555
556int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
557{
558 struct kiocb iocb;
559 struct sock_iocb siocb;
560 int ret;
561
562 init_sync_kiocb(&iocb, NULL);
563 iocb.private = &siocb;
564 ret = __sock_sendmsg(&iocb, sock, msg, size);
565 if (-EIOCBQUEUED == ret)
566 ret = wait_on_sync_kiocb(&iocb);
567 return ret;
568}
569
570int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
571 struct kvec *vec, size_t num, size_t size)
572{
573 mm_segment_t oldfs = get_fs();
574 int result;
575
576 set_fs(KERNEL_DS);
577 /*
578 * the following is safe, since for compiler definitions of kvec and
579 * iovec are identical, yielding the same in-core layout and alignment
580 */
89bddce5 581 msg->msg_iov = (struct iovec *)vec;
1da177e4
LT
582 msg->msg_iovlen = num;
583 result = sock_sendmsg(sock, msg, size);
584 set_fs(oldfs);
585 return result;
586}
587
20d49473
PO
588static int ktime2ts(ktime_t kt, struct timespec *ts)
589{
590 if (kt.tv64) {
591 *ts = ktime_to_timespec(kt);
592 return 1;
593 } else {
594 return 0;
595 }
596}
597
92f37fd2
ED
598/*
599 * called from sock_recv_timestamp() if sock_flag(sk, SOCK_RCVTSTAMP)
600 */
601void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
602 struct sk_buff *skb)
603{
20d49473
PO
604 int need_software_tstamp = sock_flag(sk, SOCK_RCVTSTAMP);
605 struct timespec ts[3];
606 int empty = 1;
607 struct skb_shared_hwtstamps *shhwtstamps =
608 skb_hwtstamps(skb);
609
610 /* Race occurred between timestamp enabling and packet
611 receiving. Fill in the current time for now. */
612 if (need_software_tstamp && skb->tstamp.tv64 == 0)
613 __net_timestamp(skb);
614
615 if (need_software_tstamp) {
616 if (!sock_flag(sk, SOCK_RCVTSTAMPNS)) {
617 struct timeval tv;
618 skb_get_timestamp(skb, &tv);
619 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP,
620 sizeof(tv), &tv);
621 } else {
622 struct timespec ts;
623 skb_get_timestampns(skb, &ts);
624 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS,
625 sizeof(ts), &ts);
626 }
627 }
628
629
630 memset(ts, 0, sizeof(ts));
631 if (skb->tstamp.tv64 &&
632 sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE)) {
633 skb_get_timestampns(skb, ts + 0);
634 empty = 0;
635 }
636 if (shhwtstamps) {
637 if (sock_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE) &&
638 ktime2ts(shhwtstamps->syststamp, ts + 1))
639 empty = 0;
640 if (sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE) &&
641 ktime2ts(shhwtstamps->hwtstamp, ts + 2))
642 empty = 0;
92f37fd2 643 }
20d49473
PO
644 if (!empty)
645 put_cmsg(msg, SOL_SOCKET,
646 SCM_TIMESTAMPING, sizeof(ts), &ts);
92f37fd2
ED
647}
648
7c81fd8b
ACM
649EXPORT_SYMBOL_GPL(__sock_recv_timestamp);
650
3b885787
NH
651inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
652{
653 if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && skb->dropcount)
654 put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL,
655 sizeof(__u32), &skb->dropcount);
656}
657
658void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
659 struct sk_buff *skb)
660{
661 sock_recv_timestamp(msg, sk, skb);
662 sock_recv_drops(msg, sk, skb);
663}
664EXPORT_SYMBOL_GPL(sock_recv_ts_and_drops);
665
a2e27255
ACM
666static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock,
667 struct msghdr *msg, size_t size, int flags)
1da177e4 668{
1da177e4
LT
669 struct sock_iocb *si = kiocb_to_siocb(iocb);
670
671 si->sock = sock;
672 si->scm = NULL;
673 si->msg = msg;
674 si->size = size;
675 si->flags = flags;
676
1da177e4
LT
677 return sock->ops->recvmsg(iocb, sock, msg, size, flags);
678}
679
a2e27255
ACM
680static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock,
681 struct msghdr *msg, size_t size, int flags)
682{
683 int err = security_socket_recvmsg(sock, msg, size, flags);
684
685 return err ?: __sock_recvmsg_nosec(iocb, sock, msg, size, flags);
686}
687
89bddce5 688int sock_recvmsg(struct socket *sock, struct msghdr *msg,
1da177e4
LT
689 size_t size, int flags)
690{
691 struct kiocb iocb;
692 struct sock_iocb siocb;
693 int ret;
694
89bddce5 695 init_sync_kiocb(&iocb, NULL);
1da177e4
LT
696 iocb.private = &siocb;
697 ret = __sock_recvmsg(&iocb, sock, msg, size, flags);
698 if (-EIOCBQUEUED == ret)
699 ret = wait_on_sync_kiocb(&iocb);
700 return ret;
701}
702
a2e27255
ACM
703static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
704 size_t size, int flags)
705{
706 struct kiocb iocb;
707 struct sock_iocb siocb;
708 int ret;
709
710 init_sync_kiocb(&iocb, NULL);
711 iocb.private = &siocb;
712 ret = __sock_recvmsg_nosec(&iocb, sock, msg, size, flags);
713 if (-EIOCBQUEUED == ret)
714 ret = wait_on_sync_kiocb(&iocb);
715 return ret;
716}
717
89bddce5
SH
718int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
719 struct kvec *vec, size_t num, size_t size, int flags)
1da177e4
LT
720{
721 mm_segment_t oldfs = get_fs();
722 int result;
723
724 set_fs(KERNEL_DS);
725 /*
726 * the following is safe, since for compiler definitions of kvec and
727 * iovec are identical, yielding the same in-core layout and alignment
728 */
89bddce5 729 msg->msg_iov = (struct iovec *)vec, msg->msg_iovlen = num;
1da177e4
LT
730 result = sock_recvmsg(sock, msg, size, flags);
731 set_fs(oldfs);
732 return result;
733}
734
735static void sock_aio_dtor(struct kiocb *iocb)
736{
737 kfree(iocb->private);
738}
739
ce1d4d3e
CH
740static ssize_t sock_sendpage(struct file *file, struct page *page,
741 int offset, size_t size, loff_t *ppos, int more)
1da177e4 742{
1da177e4
LT
743 struct socket *sock;
744 int flags;
745
ce1d4d3e
CH
746 sock = file->private_data;
747
748 flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT;
749 if (more)
750 flags |= MSG_MORE;
751
e6949583 752 return kernel_sendpage(sock, page, offset, size, flags);
ce1d4d3e 753}
1da177e4 754
9c55e01c
JA
755static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
756 struct pipe_inode_info *pipe, size_t len,
757 unsigned int flags)
758{
759 struct socket *sock = file->private_data;
760
997b37da
RDC
761 if (unlikely(!sock->ops->splice_read))
762 return -EINVAL;
763
9c55e01c
JA
764 return sock->ops->splice_read(sock, ppos, pipe, len, flags);
765}
766
ce1d4d3e 767static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb,
89bddce5 768 struct sock_iocb *siocb)
ce1d4d3e
CH
769{
770 if (!is_sync_kiocb(iocb)) {
771 siocb = kmalloc(sizeof(*siocb), GFP_KERNEL);
772 if (!siocb)
773 return NULL;
1da177e4
LT
774 iocb->ki_dtor = sock_aio_dtor;
775 }
1da177e4 776
ce1d4d3e 777 siocb->kiocb = iocb;
ce1d4d3e
CH
778 iocb->private = siocb;
779 return siocb;
1da177e4
LT
780}
781
ce1d4d3e 782static ssize_t do_sock_read(struct msghdr *msg, struct kiocb *iocb,
027445c3
BP
783 struct file *file, const struct iovec *iov,
784 unsigned long nr_segs)
ce1d4d3e
CH
785{
786 struct socket *sock = file->private_data;
787 size_t size = 0;
788 int i;
1da177e4 789
89bddce5
SH
790 for (i = 0; i < nr_segs; i++)
791 size += iov[i].iov_len;
1da177e4 792
ce1d4d3e
CH
793 msg->msg_name = NULL;
794 msg->msg_namelen = 0;
795 msg->msg_control = NULL;
796 msg->msg_controllen = 0;
89bddce5 797 msg->msg_iov = (struct iovec *)iov;
ce1d4d3e
CH
798 msg->msg_iovlen = nr_segs;
799 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
800
801 return __sock_recvmsg(iocb, sock, msg, size, msg->msg_flags);
802}
803
027445c3
BP
804static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
805 unsigned long nr_segs, loff_t pos)
ce1d4d3e
CH
806{
807 struct sock_iocb siocb, *x;
808
1da177e4
LT
809 if (pos != 0)
810 return -ESPIPE;
027445c3
BP
811
812 if (iocb->ki_left == 0) /* Match SYS5 behaviour */
1da177e4
LT
813 return 0;
814
027445c3
BP
815
816 x = alloc_sock_iocb(iocb, &siocb);
ce1d4d3e
CH
817 if (!x)
818 return -ENOMEM;
027445c3 819 return do_sock_read(&x->async_msg, iocb, iocb->ki_filp, iov, nr_segs);
1da177e4
LT
820}
821
ce1d4d3e 822static ssize_t do_sock_write(struct msghdr *msg, struct kiocb *iocb,
027445c3
BP
823 struct file *file, const struct iovec *iov,
824 unsigned long nr_segs)
1da177e4 825{
ce1d4d3e
CH
826 struct socket *sock = file->private_data;
827 size_t size = 0;
828 int i;
1da177e4 829
89bddce5
SH
830 for (i = 0; i < nr_segs; i++)
831 size += iov[i].iov_len;
1da177e4 832
ce1d4d3e
CH
833 msg->msg_name = NULL;
834 msg->msg_namelen = 0;
835 msg->msg_control = NULL;
836 msg->msg_controllen = 0;
89bddce5 837 msg->msg_iov = (struct iovec *)iov;
ce1d4d3e
CH
838 msg->msg_iovlen = nr_segs;
839 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
840 if (sock->type == SOCK_SEQPACKET)
841 msg->msg_flags |= MSG_EOR;
1da177e4 842
ce1d4d3e 843 return __sock_sendmsg(iocb, sock, msg, size);
1da177e4
LT
844}
845
027445c3
BP
846static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov,
847 unsigned long nr_segs, loff_t pos)
ce1d4d3e
CH
848{
849 struct sock_iocb siocb, *x;
1da177e4 850
ce1d4d3e
CH
851 if (pos != 0)
852 return -ESPIPE;
027445c3 853
027445c3 854 x = alloc_sock_iocb(iocb, &siocb);
ce1d4d3e
CH
855 if (!x)
856 return -ENOMEM;
1da177e4 857
027445c3 858 return do_sock_write(&x->async_msg, iocb, iocb->ki_filp, iov, nr_segs);
1da177e4
LT
859}
860
1da177e4
LT
861/*
862 * Atomic setting of ioctl hooks to avoid race
863 * with module unload.
864 */
865
4a3e2f71 866static DEFINE_MUTEX(br_ioctl_mutex);
881d966b 867static int (*br_ioctl_hook) (struct net *, unsigned int cmd, void __user *arg) = NULL;
1da177e4 868
881d966b 869void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *))
1da177e4 870{
4a3e2f71 871 mutex_lock(&br_ioctl_mutex);
1da177e4 872 br_ioctl_hook = hook;
4a3e2f71 873 mutex_unlock(&br_ioctl_mutex);
1da177e4 874}
89bddce5 875
1da177e4
LT
876EXPORT_SYMBOL(brioctl_set);
877
4a3e2f71 878static DEFINE_MUTEX(vlan_ioctl_mutex);
881d966b 879static int (*vlan_ioctl_hook) (struct net *, void __user *arg);
1da177e4 880
881d966b 881void vlan_ioctl_set(int (*hook) (struct net *, void __user *))
1da177e4 882{
4a3e2f71 883 mutex_lock(&vlan_ioctl_mutex);
1da177e4 884 vlan_ioctl_hook = hook;
4a3e2f71 885 mutex_unlock(&vlan_ioctl_mutex);
1da177e4 886}
89bddce5 887
1da177e4
LT
888EXPORT_SYMBOL(vlan_ioctl_set);
889
4a3e2f71 890static DEFINE_MUTEX(dlci_ioctl_mutex);
89bddce5 891static int (*dlci_ioctl_hook) (unsigned int, void __user *);
1da177e4 892
89bddce5 893void dlci_ioctl_set(int (*hook) (unsigned int, void __user *))
1da177e4 894{
4a3e2f71 895 mutex_lock(&dlci_ioctl_mutex);
1da177e4 896 dlci_ioctl_hook = hook;
4a3e2f71 897 mutex_unlock(&dlci_ioctl_mutex);
1da177e4 898}
89bddce5 899
1da177e4
LT
900EXPORT_SYMBOL(dlci_ioctl_set);
901
6b96018b
AB
902static long sock_do_ioctl(struct net *net, struct socket *sock,
903 unsigned int cmd, unsigned long arg)
904{
905 int err;
906 void __user *argp = (void __user *)arg;
907
908 err = sock->ops->ioctl(sock, cmd, arg);
909
910 /*
911 * If this ioctl is unknown try to hand it down
912 * to the NIC driver.
913 */
914 if (err == -ENOIOCTLCMD)
915 err = dev_ioctl(net, cmd, argp);
916
917 return err;
918}
919
1da177e4
LT
920/*
921 * With an ioctl, arg may well be a user mode pointer, but we don't know
922 * what to do with it - that's up to the protocol still.
923 */
924
925static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
926{
927 struct socket *sock;
881d966b 928 struct sock *sk;
1da177e4
LT
929 void __user *argp = (void __user *)arg;
930 int pid, err;
881d966b 931 struct net *net;
1da177e4 932
b69aee04 933 sock = file->private_data;
881d966b 934 sk = sock->sk;
3b1e0a65 935 net = sock_net(sk);
1da177e4 936 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
881d966b 937 err = dev_ioctl(net, cmd, argp);
1da177e4 938 } else
3d23e349 939#ifdef CONFIG_WEXT_CORE
1da177e4 940 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
881d966b 941 err = dev_ioctl(net, cmd, argp);
1da177e4 942 } else
3d23e349 943#endif
89bddce5 944 switch (cmd) {
1da177e4
LT
945 case FIOSETOWN:
946 case SIOCSPGRP:
947 err = -EFAULT;
948 if (get_user(pid, (int __user *)argp))
949 break;
950 err = f_setown(sock->file, pid, 1);
951 break;
952 case FIOGETOWN:
953 case SIOCGPGRP:
609d7fa9 954 err = put_user(f_getown(sock->file),
89bddce5 955 (int __user *)argp);
1da177e4
LT
956 break;
957 case SIOCGIFBR:
958 case SIOCSIFBR:
959 case SIOCBRADDBR:
960 case SIOCBRDELBR:
961 err = -ENOPKG;
962 if (!br_ioctl_hook)
963 request_module("bridge");
964
4a3e2f71 965 mutex_lock(&br_ioctl_mutex);
89bddce5 966 if (br_ioctl_hook)
881d966b 967 err = br_ioctl_hook(net, cmd, argp);
4a3e2f71 968 mutex_unlock(&br_ioctl_mutex);
1da177e4
LT
969 break;
970 case SIOCGIFVLAN:
971 case SIOCSIFVLAN:
972 err = -ENOPKG;
973 if (!vlan_ioctl_hook)
974 request_module("8021q");
975
4a3e2f71 976 mutex_lock(&vlan_ioctl_mutex);
1da177e4 977 if (vlan_ioctl_hook)
881d966b 978 err = vlan_ioctl_hook(net, argp);
4a3e2f71 979 mutex_unlock(&vlan_ioctl_mutex);
1da177e4 980 break;
1da177e4
LT
981 case SIOCADDDLCI:
982 case SIOCDELDLCI:
983 err = -ENOPKG;
984 if (!dlci_ioctl_hook)
985 request_module("dlci");
986
7512cbf6
PE
987 mutex_lock(&dlci_ioctl_mutex);
988 if (dlci_ioctl_hook)
1da177e4 989 err = dlci_ioctl_hook(cmd, argp);
7512cbf6 990 mutex_unlock(&dlci_ioctl_mutex);
1da177e4
LT
991 break;
992 default:
6b96018b 993 err = sock_do_ioctl(net, sock, cmd, arg);
1da177e4 994 break;
89bddce5 995 }
1da177e4
LT
996 return err;
997}
998
999int sock_create_lite(int family, int type, int protocol, struct socket **res)
1000{
1001 int err;
1002 struct socket *sock = NULL;
89bddce5 1003
1da177e4
LT
1004 err = security_socket_create(family, type, protocol, 1);
1005 if (err)
1006 goto out;
1007
1008 sock = sock_alloc();
1009 if (!sock) {
1010 err = -ENOMEM;
1011 goto out;
1012 }
1013
1da177e4 1014 sock->type = type;
7420ed23
VY
1015 err = security_socket_post_create(sock, family, type, protocol, 1);
1016 if (err)
1017 goto out_release;
1018
1da177e4
LT
1019out:
1020 *res = sock;
1021 return err;
7420ed23
VY
1022out_release:
1023 sock_release(sock);
1024 sock = NULL;
1025 goto out;
1da177e4
LT
1026}
1027
1028/* No kernel lock held - perfect */
89bddce5 1029static unsigned int sock_poll(struct file *file, poll_table *wait)
1da177e4
LT
1030{
1031 struct socket *sock;
1032
1033 /*
89bddce5 1034 * We can't return errors to poll, so it's either yes or no.
1da177e4 1035 */
b69aee04 1036 sock = file->private_data;
1da177e4
LT
1037 return sock->ops->poll(file, sock, wait);
1038}
1039
89bddce5 1040static int sock_mmap(struct file *file, struct vm_area_struct *vma)
1da177e4 1041{
b69aee04 1042 struct socket *sock = file->private_data;
1da177e4
LT
1043
1044 return sock->ops->mmap(file, sock, vma);
1045}
1046
20380731 1047static int sock_close(struct inode *inode, struct file *filp)
1da177e4
LT
1048{
1049 /*
89bddce5
SH
1050 * It was possible the inode is NULL we were
1051 * closing an unfinished socket.
1da177e4
LT
1052 */
1053
89bddce5 1054 if (!inode) {
1da177e4
LT
1055 printk(KERN_DEBUG "sock_close: NULL inode\n");
1056 return 0;
1057 }
1da177e4
LT
1058 sock_release(SOCKET_I(inode));
1059 return 0;
1060}
1061
1062/*
1063 * Update the socket async list
1064 *
1065 * Fasync_list locking strategy.
1066 *
1067 * 1. fasync_list is modified only under process context socket lock
1068 * i.e. under semaphore.
1069 * 2. fasync_list is used under read_lock(&sk->sk_callback_lock)
1070 * or under socket lock.
1071 * 3. fasync_list can be used from softirq context, so that
1072 * modification under socket lock have to be enhanced with
1073 * write_lock_bh(&sk->sk_callback_lock).
1074 * --ANK (990710)
1075 */
1076
1077static int sock_fasync(int fd, struct file *filp, int on)
1078{
89bddce5 1079 struct fasync_struct *fa, *fna = NULL, **prev;
1da177e4
LT
1080 struct socket *sock;
1081 struct sock *sk;
1082
89bddce5 1083 if (on) {
8b3a7005 1084 fna = kmalloc(sizeof(struct fasync_struct), GFP_KERNEL);
89bddce5 1085 if (fna == NULL)
1da177e4
LT
1086 return -ENOMEM;
1087 }
1088
b69aee04 1089 sock = filp->private_data;
1da177e4 1090
89bddce5
SH
1091 sk = sock->sk;
1092 if (sk == NULL) {
1da177e4
LT
1093 kfree(fna);
1094 return -EINVAL;
1095 }
1096
1097 lock_sock(sk);
1098
76398425
JC
1099 spin_lock(&filp->f_lock);
1100 if (on)
1101 filp->f_flags |= FASYNC;
1102 else
1103 filp->f_flags &= ~FASYNC;
1104 spin_unlock(&filp->f_lock);
1105
89bddce5 1106 prev = &(sock->fasync_list);
1da177e4 1107
89bddce5
SH
1108 for (fa = *prev; fa != NULL; prev = &fa->fa_next, fa = *prev)
1109 if (fa->fa_file == filp)
1da177e4
LT
1110 break;
1111
89bddce5
SH
1112 if (on) {
1113 if (fa != NULL) {
1da177e4 1114 write_lock_bh(&sk->sk_callback_lock);
89bddce5 1115 fa->fa_fd = fd;
1da177e4
LT
1116 write_unlock_bh(&sk->sk_callback_lock);
1117
1118 kfree(fna);
1119 goto out;
1120 }
89bddce5
SH
1121 fna->fa_file = filp;
1122 fna->fa_fd = fd;
1123 fna->magic = FASYNC_MAGIC;
1124 fna->fa_next = sock->fasync_list;
1da177e4 1125 write_lock_bh(&sk->sk_callback_lock);
89bddce5 1126 sock->fasync_list = fna;
bcdce719 1127 sock_set_flag(sk, SOCK_FASYNC);
1da177e4 1128 write_unlock_bh(&sk->sk_callback_lock);
89bddce5
SH
1129 } else {
1130 if (fa != NULL) {
1da177e4 1131 write_lock_bh(&sk->sk_callback_lock);
89bddce5 1132 *prev = fa->fa_next;
bcdce719
ED
1133 if (!sock->fasync_list)
1134 sock_reset_flag(sk, SOCK_FASYNC);
1da177e4
LT
1135 write_unlock_bh(&sk->sk_callback_lock);
1136 kfree(fa);
1137 }
1138 }
1139
1140out:
1141 release_sock(sock->sk);
1142 return 0;
1143}
1144
1145/* This function may be called only under socket lock or callback_lock */
1146
1147int sock_wake_async(struct socket *sock, int how, int band)
1148{
1149 if (!sock || !sock->fasync_list)
1150 return -1;
89bddce5 1151 switch (how) {
8d8ad9d7 1152 case SOCK_WAKE_WAITD:
1da177e4
LT
1153 if (test_bit(SOCK_ASYNC_WAITDATA, &sock->flags))
1154 break;
1155 goto call_kill;
8d8ad9d7 1156 case SOCK_WAKE_SPACE:
1da177e4
LT
1157 if (!test_and_clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags))
1158 break;
1159 /* fall through */
8d8ad9d7 1160 case SOCK_WAKE_IO:
89bddce5 1161call_kill:
1da177e4
LT
1162 __kill_fasync(sock->fasync_list, SIGIO, band);
1163 break;
8d8ad9d7 1164 case SOCK_WAKE_URG:
1da177e4
LT
1165 __kill_fasync(sock->fasync_list, SIGURG, band);
1166 }
1167 return 0;
1168}
1169
1b8d7ae4 1170static int __sock_create(struct net *net, int family, int type, int protocol,
89bddce5 1171 struct socket **res, int kern)
1da177e4
LT
1172{
1173 int err;
1174 struct socket *sock;
55737fda 1175 const struct net_proto_family *pf;
1da177e4
LT
1176
1177 /*
89bddce5 1178 * Check protocol is in range
1da177e4
LT
1179 */
1180 if (family < 0 || family >= NPROTO)
1181 return -EAFNOSUPPORT;
1182 if (type < 0 || type >= SOCK_MAX)
1183 return -EINVAL;
1184
1185 /* Compatibility.
1186
1187 This uglymoron is moved from INET layer to here to avoid
1188 deadlock in module load.
1189 */
1190 if (family == PF_INET && type == SOCK_PACKET) {
89bddce5 1191 static int warned;
1da177e4
LT
1192 if (!warned) {
1193 warned = 1;
89bddce5
SH
1194 printk(KERN_INFO "%s uses obsolete (PF_INET,SOCK_PACKET)\n",
1195 current->comm);
1da177e4
LT
1196 }
1197 family = PF_PACKET;
1198 }
1199
1200 err = security_socket_create(family, type, protocol, kern);
1201 if (err)
1202 return err;
89bddce5 1203
55737fda
SH
1204 /*
1205 * Allocate the socket and allow the family to set things up. if
1206 * the protocol is 0, the family is instructed to select an appropriate
1207 * default.
1208 */
1209 sock = sock_alloc();
1210 if (!sock) {
1211 if (net_ratelimit())
1212 printk(KERN_WARNING "socket: no more sockets\n");
1213 return -ENFILE; /* Not exactly a match, but its the
1214 closest posix thing */
1215 }
1216
1217 sock->type = type;
1218
95a5afca 1219#ifdef CONFIG_MODULES
89bddce5
SH
1220 /* Attempt to load a protocol module if the find failed.
1221 *
1222 * 12/09/1996 Marcin: But! this makes REALLY only sense, if the user
1da177e4
LT
1223 * requested real, full-featured networking support upon configuration.
1224 * Otherwise module support will break!
1225 */
55737fda 1226 if (net_families[family] == NULL)
89bddce5 1227 request_module("net-pf-%d", family);
1da177e4
LT
1228#endif
1229
55737fda
SH
1230 rcu_read_lock();
1231 pf = rcu_dereference(net_families[family]);
1232 err = -EAFNOSUPPORT;
1233 if (!pf)
1234 goto out_release;
1da177e4
LT
1235
1236 /*
1237 * We will call the ->create function, that possibly is in a loadable
1238 * module, so we have to bump that loadable module refcnt first.
1239 */
55737fda 1240 if (!try_module_get(pf->owner))
1da177e4
LT
1241 goto out_release;
1242
55737fda
SH
1243 /* Now protected by module ref count */
1244 rcu_read_unlock();
1245
3f378b68 1246 err = pf->create(net, sock, protocol, kern);
55737fda 1247 if (err < 0)
1da177e4 1248 goto out_module_put;
a79af59e 1249
1da177e4
LT
1250 /*
1251 * Now to bump the refcnt of the [loadable] module that owns this
1252 * socket at sock_release time we decrement its refcnt.
1253 */
55737fda
SH
1254 if (!try_module_get(sock->ops->owner))
1255 goto out_module_busy;
1256
1da177e4
LT
1257 /*
1258 * Now that we're done with the ->create function, the [loadable]
1259 * module can have its refcnt decremented
1260 */
55737fda 1261 module_put(pf->owner);
7420ed23
VY
1262 err = security_socket_post_create(sock, family, type, protocol, kern);
1263 if (err)
3b185525 1264 goto out_sock_release;
55737fda 1265 *res = sock;
1da177e4 1266
55737fda
SH
1267 return 0;
1268
1269out_module_busy:
1270 err = -EAFNOSUPPORT;
1da177e4 1271out_module_put:
55737fda
SH
1272 sock->ops = NULL;
1273 module_put(pf->owner);
1274out_sock_release:
1da177e4 1275 sock_release(sock);
55737fda
SH
1276 return err;
1277
1278out_release:
1279 rcu_read_unlock();
1280 goto out_sock_release;
1da177e4
LT
1281}
1282
1283int sock_create(int family, int type, int protocol, struct socket **res)
1284{
1b8d7ae4 1285 return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
1da177e4
LT
1286}
1287
1288int sock_create_kern(int family, int type, int protocol, struct socket **res)
1289{
1b8d7ae4 1290 return __sock_create(&init_net, family, type, protocol, res, 1);
1da177e4
LT
1291}
1292
3e0fa65f 1293SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1da177e4
LT
1294{
1295 int retval;
1296 struct socket *sock;
a677a039
UD
1297 int flags;
1298
e38b36f3
UD
1299 /* Check the SOCK_* constants for consistency. */
1300 BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC);
1301 BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK);
1302 BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK);
1303 BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK);
1304
a677a039 1305 flags = type & ~SOCK_TYPE_MASK;
77d27200 1306 if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
a677a039
UD
1307 return -EINVAL;
1308 type &= SOCK_TYPE_MASK;
1da177e4 1309
aaca0bdc
UD
1310 if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1311 flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1312
1da177e4
LT
1313 retval = sock_create(family, type, protocol, &sock);
1314 if (retval < 0)
1315 goto out;
1316
77d27200 1317 retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
1da177e4
LT
1318 if (retval < 0)
1319 goto out_release;
1320
1321out:
1322 /* It may be already another descriptor 8) Not kernel problem. */
1323 return retval;
1324
1325out_release:
1326 sock_release(sock);
1327 return retval;
1328}
1329
1330/*
1331 * Create a pair of connected sockets.
1332 */
1333
3e0fa65f
HC
1334SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
1335 int __user *, usockvec)
1da177e4
LT
1336{
1337 struct socket *sock1, *sock2;
1338 int fd1, fd2, err;
db349509 1339 struct file *newfile1, *newfile2;
a677a039
UD
1340 int flags;
1341
1342 flags = type & ~SOCK_TYPE_MASK;
77d27200 1343 if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
a677a039
UD
1344 return -EINVAL;
1345 type &= SOCK_TYPE_MASK;
1da177e4 1346
aaca0bdc
UD
1347 if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1348 flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1349
1da177e4
LT
1350 /*
1351 * Obtain the first socket and check if the underlying protocol
1352 * supports the socketpair call.
1353 */
1354
1355 err = sock_create(family, type, protocol, &sock1);
1356 if (err < 0)
1357 goto out;
1358
1359 err = sock_create(family, type, protocol, &sock2);
1360 if (err < 0)
1361 goto out_release_1;
1362
1363 err = sock1->ops->socketpair(sock1, sock2);
89bddce5 1364 if (err < 0)
1da177e4
LT
1365 goto out_release_both;
1366
7cbe66b6 1367 fd1 = sock_alloc_file(sock1, &newfile1, flags);
bf3c23d1
DM
1368 if (unlikely(fd1 < 0)) {
1369 err = fd1;
db349509 1370 goto out_release_both;
bf3c23d1 1371 }
1da177e4 1372
7cbe66b6 1373 fd2 = sock_alloc_file(sock2, &newfile2, flags);
198de4d7
AV
1374 if (unlikely(fd2 < 0)) {
1375 err = fd2;
1376 fput(newfile1);
1377 put_unused_fd(fd1);
1378 sock_release(sock2);
1379 goto out;
db349509
AV
1380 }
1381
157cf649 1382 audit_fd_pair(fd1, fd2);
db349509
AV
1383 fd_install(fd1, newfile1);
1384 fd_install(fd2, newfile2);
1da177e4
LT
1385 /* fd1 and fd2 may be already another descriptors.
1386 * Not kernel problem.
1387 */
1388
89bddce5 1389 err = put_user(fd1, &usockvec[0]);
1da177e4
LT
1390 if (!err)
1391 err = put_user(fd2, &usockvec[1]);
1392 if (!err)
1393 return 0;
1394
1395 sys_close(fd2);
1396 sys_close(fd1);
1397 return err;
1398
1da177e4 1399out_release_both:
89bddce5 1400 sock_release(sock2);
1da177e4 1401out_release_1:
89bddce5 1402 sock_release(sock1);
1da177e4
LT
1403out:
1404 return err;
1405}
1406
1da177e4
LT
1407/*
1408 * Bind a name to a socket. Nothing much to do here since it's
1409 * the protocol's responsibility to handle the local address.
1410 *
1411 * We move the socket address to kernel space before we call
1412 * the protocol layer (having also checked the address is ok).
1413 */
1414
20f37034 1415SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
1da177e4
LT
1416{
1417 struct socket *sock;
230b1839 1418 struct sockaddr_storage address;
6cb153ca 1419 int err, fput_needed;
1da177e4 1420
89bddce5 1421 sock = sockfd_lookup_light(fd, &err, &fput_needed);
e71a4783 1422 if (sock) {
230b1839 1423 err = move_addr_to_kernel(umyaddr, addrlen, (struct sockaddr *)&address);
89bddce5
SH
1424 if (err >= 0) {
1425 err = security_socket_bind(sock,
230b1839 1426 (struct sockaddr *)&address,
89bddce5 1427 addrlen);
6cb153ca
BL
1428 if (!err)
1429 err = sock->ops->bind(sock,
89bddce5 1430 (struct sockaddr *)
230b1839 1431 &address, addrlen);
1da177e4 1432 }
6cb153ca 1433 fput_light(sock->file, fput_needed);
89bddce5 1434 }
1da177e4
LT
1435 return err;
1436}
1437
1da177e4
LT
1438/*
1439 * Perform a listen. Basically, we allow the protocol to do anything
1440 * necessary for a listen, and if that works, we mark the socket as
1441 * ready for listening.
1442 */
1443
3e0fa65f 1444SYSCALL_DEFINE2(listen, int, fd, int, backlog)
1da177e4
LT
1445{
1446 struct socket *sock;
6cb153ca 1447 int err, fput_needed;
b8e1f9b5 1448 int somaxconn;
89bddce5
SH
1449
1450 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1451 if (sock) {
8efa6e93 1452 somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
b8e1f9b5
PE
1453 if ((unsigned)backlog > somaxconn)
1454 backlog = somaxconn;
1da177e4
LT
1455
1456 err = security_socket_listen(sock, backlog);
6cb153ca
BL
1457 if (!err)
1458 err = sock->ops->listen(sock, backlog);
1da177e4 1459
6cb153ca 1460 fput_light(sock->file, fput_needed);
1da177e4
LT
1461 }
1462 return err;
1463}
1464
1da177e4
LT
1465/*
1466 * For accept, we attempt to create a new socket, set up the link
1467 * with the client, wake up the client, then return the new
1468 * connected fd. We collect the address of the connector in kernel
1469 * space and move it to user at the very end. This is unclean because
1470 * we open the socket then return an error.
1471 *
1472 * 1003.1g adds the ability to recvmsg() to query connection pending
1473 * status to recvmsg. We need to add that support in a way thats
1474 * clean when we restucture accept also.
1475 */
1476
20f37034
HC
1477SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
1478 int __user *, upeer_addrlen, int, flags)
1da177e4
LT
1479{
1480 struct socket *sock, *newsock;
39d8c1b6 1481 struct file *newfile;
6cb153ca 1482 int err, len, newfd, fput_needed;
230b1839 1483 struct sockaddr_storage address;
1da177e4 1484
77d27200 1485 if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
aaca0bdc
UD
1486 return -EINVAL;
1487
1488 if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1489 flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1490
6cb153ca 1491 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1da177e4
LT
1492 if (!sock)
1493 goto out;
1494
1495 err = -ENFILE;
89bddce5 1496 if (!(newsock = sock_alloc()))
1da177e4
LT
1497 goto out_put;
1498
1499 newsock->type = sock->type;
1500 newsock->ops = sock->ops;
1501
1da177e4
LT
1502 /*
1503 * We don't need try_module_get here, as the listening socket (sock)
1504 * has the protocol module (sock->ops->owner) held.
1505 */
1506 __module_get(newsock->ops->owner);
1507
7cbe66b6 1508 newfd = sock_alloc_file(newsock, &newfile, flags);
39d8c1b6
DM
1509 if (unlikely(newfd < 0)) {
1510 err = newfd;
9a1875e6
DM
1511 sock_release(newsock);
1512 goto out_put;
39d8c1b6
DM
1513 }
1514
a79af59e
FF
1515 err = security_socket_accept(sock, newsock);
1516 if (err)
39d8c1b6 1517 goto out_fd;
a79af59e 1518
1da177e4
LT
1519 err = sock->ops->accept(sock, newsock, sock->file->f_flags);
1520 if (err < 0)
39d8c1b6 1521 goto out_fd;
1da177e4
LT
1522
1523 if (upeer_sockaddr) {
230b1839 1524 if (newsock->ops->getname(newsock, (struct sockaddr *)&address,
89bddce5 1525 &len, 2) < 0) {
1da177e4 1526 err = -ECONNABORTED;
39d8c1b6 1527 goto out_fd;
1da177e4 1528 }
230b1839
YH
1529 err = move_addr_to_user((struct sockaddr *)&address,
1530 len, upeer_sockaddr, upeer_addrlen);
1da177e4 1531 if (err < 0)
39d8c1b6 1532 goto out_fd;
1da177e4
LT
1533 }
1534
1535 /* File flags are not inherited via accept() unlike another OSes. */
1536
39d8c1b6
DM
1537 fd_install(newfd, newfile);
1538 err = newfd;
1da177e4 1539
1da177e4 1540out_put:
6cb153ca 1541 fput_light(sock->file, fput_needed);
1da177e4
LT
1542out:
1543 return err;
39d8c1b6 1544out_fd:
9606a216 1545 fput(newfile);
39d8c1b6 1546 put_unused_fd(newfd);
1da177e4
LT
1547 goto out_put;
1548}
1549
20f37034
HC
1550SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr,
1551 int __user *, upeer_addrlen)
aaca0bdc 1552{
de11defe 1553 return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
aaca0bdc
UD
1554}
1555
1da177e4
LT
1556/*
1557 * Attempt to connect to a socket with the server address. The address
1558 * is in user space so we verify it is OK and move it to kernel space.
1559 *
1560 * For 1003.1g we need to add clean support for a bind to AF_UNSPEC to
1561 * break bindings
1562 *
1563 * NOTE: 1003.1g draft 6.3 is broken with respect to AX.25/NetROM and
1564 * other SEQPACKET protocols that take time to connect() as it doesn't
1565 * include the -EINPROGRESS status for such sockets.
1566 */
1567
20f37034
HC
1568SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
1569 int, addrlen)
1da177e4
LT
1570{
1571 struct socket *sock;
230b1839 1572 struct sockaddr_storage address;
6cb153ca 1573 int err, fput_needed;
1da177e4 1574
6cb153ca 1575 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1da177e4
LT
1576 if (!sock)
1577 goto out;
230b1839 1578 err = move_addr_to_kernel(uservaddr, addrlen, (struct sockaddr *)&address);
1da177e4
LT
1579 if (err < 0)
1580 goto out_put;
1581
89bddce5 1582 err =
230b1839 1583 security_socket_connect(sock, (struct sockaddr *)&address, addrlen);
1da177e4
LT
1584 if (err)
1585 goto out_put;
1586
230b1839 1587 err = sock->ops->connect(sock, (struct sockaddr *)&address, addrlen,
1da177e4
LT
1588 sock->file->f_flags);
1589out_put:
6cb153ca 1590 fput_light(sock->file, fput_needed);
1da177e4
LT
1591out:
1592 return err;
1593}
1594
1595/*
1596 * Get the local address ('name') of a socket object. Move the obtained
1597 * name to user space.
1598 */
1599
20f37034
HC
1600SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
1601 int __user *, usockaddr_len)
1da177e4
LT
1602{
1603 struct socket *sock;
230b1839 1604 struct sockaddr_storage address;
6cb153ca 1605 int len, err, fput_needed;
89bddce5 1606
6cb153ca 1607 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1da177e4
LT
1608 if (!sock)
1609 goto out;
1610
1611 err = security_socket_getsockname(sock);
1612 if (err)
1613 goto out_put;
1614
230b1839 1615 err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0);
1da177e4
LT
1616 if (err)
1617 goto out_put;
230b1839 1618 err = move_addr_to_user((struct sockaddr *)&address, len, usockaddr, usockaddr_len);
1da177e4
LT
1619
1620out_put:
6cb153ca 1621 fput_light(sock->file, fput_needed);
1da177e4
LT
1622out:
1623 return err;
1624}
1625
1626/*
1627 * Get the remote address ('name') of a socket object. Move the obtained
1628 * name to user space.
1629 */
1630
20f37034
HC
1631SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
1632 int __user *, usockaddr_len)
1da177e4
LT
1633{
1634 struct socket *sock;
230b1839 1635 struct sockaddr_storage address;
6cb153ca 1636 int len, err, fput_needed;
1da177e4 1637
89bddce5
SH
1638 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1639 if (sock != NULL) {
1da177e4
LT
1640 err = security_socket_getpeername(sock);
1641 if (err) {
6cb153ca 1642 fput_light(sock->file, fput_needed);
1da177e4
LT
1643 return err;
1644 }
1645
89bddce5 1646 err =
230b1839 1647 sock->ops->getname(sock, (struct sockaddr *)&address, &len,
89bddce5 1648 1);
1da177e4 1649 if (!err)
230b1839 1650 err = move_addr_to_user((struct sockaddr *)&address, len, usockaddr,
89bddce5 1651 usockaddr_len);
6cb153ca 1652 fput_light(sock->file, fput_needed);
1da177e4
LT
1653 }
1654 return err;
1655}
1656
1657/*
1658 * Send a datagram to a given address. We move the address into kernel
1659 * space and check the user space data area is readable before invoking
1660 * the protocol.
1661 */
1662
3e0fa65f
HC
1663SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1664 unsigned, flags, struct sockaddr __user *, addr,
1665 int, addr_len)
1da177e4
LT
1666{
1667 struct socket *sock;
230b1839 1668 struct sockaddr_storage address;
1da177e4
LT
1669 int err;
1670 struct msghdr msg;
1671 struct iovec iov;
6cb153ca 1672 int fput_needed;
6cb153ca 1673
de0fa95c
PE
1674 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1675 if (!sock)
4387ff75 1676 goto out;
6cb153ca 1677
89bddce5
SH
1678 iov.iov_base = buff;
1679 iov.iov_len = len;
1680 msg.msg_name = NULL;
1681 msg.msg_iov = &iov;
1682 msg.msg_iovlen = 1;
1683 msg.msg_control = NULL;
1684 msg.msg_controllen = 0;
1685 msg.msg_namelen = 0;
6cb153ca 1686 if (addr) {
230b1839 1687 err = move_addr_to_kernel(addr, addr_len, (struct sockaddr *)&address);
1da177e4
LT
1688 if (err < 0)
1689 goto out_put;
230b1839 1690 msg.msg_name = (struct sockaddr *)&address;
89bddce5 1691 msg.msg_namelen = addr_len;
1da177e4
LT
1692 }
1693 if (sock->file->f_flags & O_NONBLOCK)
1694 flags |= MSG_DONTWAIT;
1695 msg.msg_flags = flags;
1696 err = sock_sendmsg(sock, &msg, len);
1697
89bddce5 1698out_put:
de0fa95c 1699 fput_light(sock->file, fput_needed);
4387ff75 1700out:
1da177e4
LT
1701 return err;
1702}
1703
1704/*
89bddce5 1705 * Send a datagram down a socket.
1da177e4
LT
1706 */
1707
3e0fa65f
HC
1708SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
1709 unsigned, flags)
1da177e4
LT
1710{
1711 return sys_sendto(fd, buff, len, flags, NULL, 0);
1712}
1713
1714/*
89bddce5 1715 * Receive a frame from the socket and optionally record the address of the
1da177e4
LT
1716 * sender. We verify the buffers are writable and if needed move the
1717 * sender address from kernel to user space.
1718 */
1719
3e0fa65f
HC
1720SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
1721 unsigned, flags, struct sockaddr __user *, addr,
1722 int __user *, addr_len)
1da177e4
LT
1723{
1724 struct socket *sock;
1725 struct iovec iov;
1726 struct msghdr msg;
230b1839 1727 struct sockaddr_storage address;
89bddce5 1728 int err, err2;
6cb153ca
BL
1729 int fput_needed;
1730
de0fa95c 1731 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1da177e4 1732 if (!sock)
de0fa95c 1733 goto out;
1da177e4 1734
89bddce5
SH
1735 msg.msg_control = NULL;
1736 msg.msg_controllen = 0;
1737 msg.msg_iovlen = 1;
1738 msg.msg_iov = &iov;
1739 iov.iov_len = size;
1740 iov.iov_base = ubuf;
230b1839
YH
1741 msg.msg_name = (struct sockaddr *)&address;
1742 msg.msg_namelen = sizeof(address);
1da177e4
LT
1743 if (sock->file->f_flags & O_NONBLOCK)
1744 flags |= MSG_DONTWAIT;
89bddce5 1745 err = sock_recvmsg(sock, &msg, size, flags);
1da177e4 1746
89bddce5 1747 if (err >= 0 && addr != NULL) {
230b1839
YH
1748 err2 = move_addr_to_user((struct sockaddr *)&address,
1749 msg.msg_namelen, addr, addr_len);
89bddce5
SH
1750 if (err2 < 0)
1751 err = err2;
1da177e4 1752 }
de0fa95c
PE
1753
1754 fput_light(sock->file, fput_needed);
4387ff75 1755out:
1da177e4
LT
1756 return err;
1757}
1758
1759/*
89bddce5 1760 * Receive a datagram from a socket.
1da177e4
LT
1761 */
1762
89bddce5
SH
1763asmlinkage long sys_recv(int fd, void __user *ubuf, size_t size,
1764 unsigned flags)
1da177e4
LT
1765{
1766 return sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
1767}
1768
1769/*
1770 * Set a socket option. Because we don't know the option lengths we have
1771 * to pass the user mode parameter for the protocols to sort out.
1772 */
1773
20f37034
HC
1774SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
1775 char __user *, optval, int, optlen)
1da177e4 1776{
6cb153ca 1777 int err, fput_needed;
1da177e4
LT
1778 struct socket *sock;
1779
1780 if (optlen < 0)
1781 return -EINVAL;
89bddce5
SH
1782
1783 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1784 if (sock != NULL) {
1785 err = security_socket_setsockopt(sock, level, optname);
6cb153ca
BL
1786 if (err)
1787 goto out_put;
1da177e4
LT
1788
1789 if (level == SOL_SOCKET)
89bddce5
SH
1790 err =
1791 sock_setsockopt(sock, level, optname, optval,
1792 optlen);
1da177e4 1793 else
89bddce5
SH
1794 err =
1795 sock->ops->setsockopt(sock, level, optname, optval,
1796 optlen);
6cb153ca
BL
1797out_put:
1798 fput_light(sock->file, fput_needed);
1da177e4
LT
1799 }
1800 return err;
1801}
1802
1803/*
1804 * Get a socket option. Because we don't know the option lengths we have
1805 * to pass a user mode parameter for the protocols to sort out.
1806 */
1807
20f37034
HC
1808SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
1809 char __user *, optval, int __user *, optlen)
1da177e4 1810{
6cb153ca 1811 int err, fput_needed;
1da177e4
LT
1812 struct socket *sock;
1813
89bddce5
SH
1814 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1815 if (sock != NULL) {
6cb153ca
BL
1816 err = security_socket_getsockopt(sock, level, optname);
1817 if (err)
1818 goto out_put;
1da177e4
LT
1819
1820 if (level == SOL_SOCKET)
89bddce5
SH
1821 err =
1822 sock_getsockopt(sock, level, optname, optval,
1823 optlen);
1da177e4 1824 else
89bddce5
SH
1825 err =
1826 sock->ops->getsockopt(sock, level, optname, optval,
1827 optlen);
6cb153ca
BL
1828out_put:
1829 fput_light(sock->file, fput_needed);
1da177e4
LT
1830 }
1831 return err;
1832}
1833
1da177e4
LT
1834/*
1835 * Shutdown a socket.
1836 */
1837
754fe8d2 1838SYSCALL_DEFINE2(shutdown, int, fd, int, how)
1da177e4 1839{
6cb153ca 1840 int err, fput_needed;
1da177e4
LT
1841 struct socket *sock;
1842
89bddce5
SH
1843 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1844 if (sock != NULL) {
1da177e4 1845 err = security_socket_shutdown(sock, how);
6cb153ca
BL
1846 if (!err)
1847 err = sock->ops->shutdown(sock, how);
1848 fput_light(sock->file, fput_needed);
1da177e4
LT
1849 }
1850 return err;
1851}
1852
89bddce5 1853/* A couple of helpful macros for getting the address of the 32/64 bit
1da177e4
LT
1854 * fields which are the same type (int / unsigned) on our platforms.
1855 */
1856#define COMPAT_MSG(msg, member) ((MSG_CMSG_COMPAT & flags) ? &msg##_compat->member : &msg->member)
1857#define COMPAT_NAMELEN(msg) COMPAT_MSG(msg, msg_namelen)
1858#define COMPAT_FLAGS(msg) COMPAT_MSG(msg, msg_flags)
1859
1da177e4
LT
1860/*
1861 * BSD sendmsg interface
1862 */
1863
3e0fa65f 1864SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
1da177e4 1865{
89bddce5
SH
1866 struct compat_msghdr __user *msg_compat =
1867 (struct compat_msghdr __user *)msg;
1da177e4 1868 struct socket *sock;
230b1839 1869 struct sockaddr_storage address;
1da177e4 1870 struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
b9d717a7 1871 unsigned char ctl[sizeof(struct cmsghdr) + 20]
89bddce5
SH
1872 __attribute__ ((aligned(sizeof(__kernel_size_t))));
1873 /* 20 is size of ipv6_pktinfo */
1da177e4
LT
1874 unsigned char *ctl_buf = ctl;
1875 struct msghdr msg_sys;
1876 int err, ctl_len, iov_size, total_len;
6cb153ca 1877 int fput_needed;
89bddce5 1878
1da177e4
LT
1879 err = -EFAULT;
1880 if (MSG_CMSG_COMPAT & flags) {
1881 if (get_compat_msghdr(&msg_sys, msg_compat))
1882 return -EFAULT;
89bddce5
SH
1883 }
1884 else if (copy_from_user(&msg_sys, msg, sizeof(struct msghdr)))
1da177e4
LT
1885 return -EFAULT;
1886
6cb153ca 1887 sock = sockfd_lookup_light(fd, &err, &fput_needed);
89bddce5 1888 if (!sock)
1da177e4
LT
1889 goto out;
1890
1891 /* do not move before msg_sys is valid */
1892 err = -EMSGSIZE;
1893 if (msg_sys.msg_iovlen > UIO_MAXIOV)
1894 goto out_put;
1895
89bddce5 1896 /* Check whether to allocate the iovec area */
1da177e4
LT
1897 err = -ENOMEM;
1898 iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);
1899 if (msg_sys.msg_iovlen > UIO_FASTIOV) {
1900 iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
1901 if (!iov)
1902 goto out_put;
1903 }
1904
1905 /* This will also move the address data into kernel space */
1906 if (MSG_CMSG_COMPAT & flags) {
230b1839
YH
1907 err = verify_compat_iovec(&msg_sys, iov,
1908 (struct sockaddr *)&address,
1909 VERIFY_READ);
1da177e4 1910 } else
230b1839
YH
1911 err = verify_iovec(&msg_sys, iov,
1912 (struct sockaddr *)&address,
1913 VERIFY_READ);
89bddce5 1914 if (err < 0)
1da177e4
LT
1915 goto out_freeiov;
1916 total_len = err;
1917
1918 err = -ENOBUFS;
1919
1920 if (msg_sys.msg_controllen > INT_MAX)
1921 goto out_freeiov;
89bddce5 1922 ctl_len = msg_sys.msg_controllen;
1da177e4 1923 if ((MSG_CMSG_COMPAT & flags) && ctl_len) {
89bddce5
SH
1924 err =
1925 cmsghdr_from_user_compat_to_kern(&msg_sys, sock->sk, ctl,
1926 sizeof(ctl));
1da177e4
LT
1927 if (err)
1928 goto out_freeiov;
1929 ctl_buf = msg_sys.msg_control;
8920e8f9 1930 ctl_len = msg_sys.msg_controllen;
1da177e4 1931 } else if (ctl_len) {
89bddce5 1932 if (ctl_len > sizeof(ctl)) {
1da177e4 1933 ctl_buf = sock_kmalloc(sock->sk, ctl_len, GFP_KERNEL);
89bddce5 1934 if (ctl_buf == NULL)
1da177e4
LT
1935 goto out_freeiov;
1936 }
1937 err = -EFAULT;
1938 /*
1939 * Careful! Before this, msg_sys.msg_control contains a user pointer.
1940 * Afterwards, it will be a kernel pointer. Thus the compiler-assisted
1941 * checking falls down on this.
1942 */
89bddce5
SH
1943 if (copy_from_user(ctl_buf, (void __user *)msg_sys.msg_control,
1944 ctl_len))
1da177e4
LT
1945 goto out_freectl;
1946 msg_sys.msg_control = ctl_buf;
1947 }
1948 msg_sys.msg_flags = flags;
1949
1950 if (sock->file->f_flags & O_NONBLOCK)
1951 msg_sys.msg_flags |= MSG_DONTWAIT;
1952 err = sock_sendmsg(sock, &msg_sys, total_len);
1953
1954out_freectl:
89bddce5 1955 if (ctl_buf != ctl)
1da177e4
LT
1956 sock_kfree_s(sock->sk, ctl_buf, ctl_len);
1957out_freeiov:
1958 if (iov != iovstack)
1959 sock_kfree_s(sock->sk, iov, iov_size);
1960out_put:
6cb153ca 1961 fput_light(sock->file, fput_needed);
89bddce5 1962out:
1da177e4
LT
1963 return err;
1964}
1965
a2e27255
ACM
1966static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
1967 struct msghdr *msg_sys, unsigned flags, int nosec)
1da177e4 1968{
89bddce5
SH
1969 struct compat_msghdr __user *msg_compat =
1970 (struct compat_msghdr __user *)msg;
1da177e4 1971 struct iovec iovstack[UIO_FASTIOV];
89bddce5 1972 struct iovec *iov = iovstack;
1da177e4
LT
1973 unsigned long cmsg_ptr;
1974 int err, iov_size, total_len, len;
1975
1976 /* kernel mode address */
230b1839 1977 struct sockaddr_storage addr;
1da177e4
LT
1978
1979 /* user mode address pointers */
1980 struct sockaddr __user *uaddr;
1981 int __user *uaddr_len;
89bddce5 1982
1da177e4 1983 if (MSG_CMSG_COMPAT & flags) {
a2e27255 1984 if (get_compat_msghdr(msg_sys, msg_compat))
1da177e4 1985 return -EFAULT;
89bddce5 1986 }
a2e27255 1987 else if (copy_from_user(msg_sys, msg, sizeof(struct msghdr)))
89bddce5 1988 return -EFAULT;
1da177e4 1989
1da177e4 1990 err = -EMSGSIZE;
a2e27255
ACM
1991 if (msg_sys->msg_iovlen > UIO_MAXIOV)
1992 goto out;
89bddce5
SH
1993
1994 /* Check whether to allocate the iovec area */
1da177e4 1995 err = -ENOMEM;
a2e27255
ACM
1996 iov_size = msg_sys->msg_iovlen * sizeof(struct iovec);
1997 if (msg_sys->msg_iovlen > UIO_FASTIOV) {
1da177e4
LT
1998 iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
1999 if (!iov)
a2e27255 2000 goto out;
1da177e4
LT
2001 }
2002
2003 /*
89bddce5
SH
2004 * Save the user-mode address (verify_iovec will change the
2005 * kernel msghdr to use the kernel address space)
1da177e4 2006 */
89bddce5 2007
a2e27255 2008 uaddr = (__force void __user *)msg_sys->msg_name;
1da177e4
LT
2009 uaddr_len = COMPAT_NAMELEN(msg);
2010 if (MSG_CMSG_COMPAT & flags) {
a2e27255 2011 err = verify_compat_iovec(msg_sys, iov,
230b1839
YH
2012 (struct sockaddr *)&addr,
2013 VERIFY_WRITE);
1da177e4 2014 } else
a2e27255 2015 err = verify_iovec(msg_sys, iov,
230b1839
YH
2016 (struct sockaddr *)&addr,
2017 VERIFY_WRITE);
1da177e4
LT
2018 if (err < 0)
2019 goto out_freeiov;
89bddce5 2020 total_len = err;
1da177e4 2021
a2e27255
ACM
2022 cmsg_ptr = (unsigned long)msg_sys->msg_control;
2023 msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);
89bddce5 2024
1da177e4
LT
2025 if (sock->file->f_flags & O_NONBLOCK)
2026 flags |= MSG_DONTWAIT;
a2e27255
ACM
2027 err = (nosec ? sock_recvmsg_nosec : sock_recvmsg)(sock, msg_sys,
2028 total_len, flags);
1da177e4
LT
2029 if (err < 0)
2030 goto out_freeiov;
2031 len = err;
2032
2033 if (uaddr != NULL) {
230b1839 2034 err = move_addr_to_user((struct sockaddr *)&addr,
a2e27255 2035 msg_sys->msg_namelen, uaddr,
89bddce5 2036 uaddr_len);
1da177e4
LT
2037 if (err < 0)
2038 goto out_freeiov;
2039 }
a2e27255 2040 err = __put_user((msg_sys->msg_flags & ~MSG_CMSG_COMPAT),
37f7f421 2041 COMPAT_FLAGS(msg));
1da177e4
LT
2042 if (err)
2043 goto out_freeiov;
2044 if (MSG_CMSG_COMPAT & flags)
a2e27255 2045 err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
1da177e4
LT
2046 &msg_compat->msg_controllen);
2047 else
a2e27255 2048 err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
1da177e4
LT
2049 &msg->msg_controllen);
2050 if (err)
2051 goto out_freeiov;
2052 err = len;
2053
2054out_freeiov:
2055 if (iov != iovstack)
2056 sock_kfree_s(sock->sk, iov, iov_size);
a2e27255
ACM
2057out:
2058 return err;
2059}
2060
2061/*
2062 * BSD recvmsg interface
2063 */
2064
2065SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
2066 unsigned int, flags)
2067{
2068 int fput_needed, err;
2069 struct msghdr msg_sys;
2070 struct socket *sock = sockfd_lookup_light(fd, &err, &fput_needed);
2071
2072 if (!sock)
2073 goto out;
2074
2075 err = __sys_recvmsg(sock, msg, &msg_sys, flags, 0);
2076
6cb153ca 2077 fput_light(sock->file, fput_needed);
1da177e4
LT
2078out:
2079 return err;
2080}
2081
a2e27255
ACM
2082/*
2083 * Linux recvmmsg interface
2084 */
2085
2086int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
2087 unsigned int flags, struct timespec *timeout)
2088{
2089 int fput_needed, err, datagrams;
2090 struct socket *sock;
2091 struct mmsghdr __user *entry;
d7256d0e 2092 struct compat_mmsghdr __user *compat_entry;
a2e27255
ACM
2093 struct msghdr msg_sys;
2094 struct timespec end_time;
2095
2096 if (timeout &&
2097 poll_select_set_timeout(&end_time, timeout->tv_sec,
2098 timeout->tv_nsec))
2099 return -EINVAL;
2100
2101 datagrams = 0;
2102
2103 sock = sockfd_lookup_light(fd, &err, &fput_needed);
2104 if (!sock)
2105 return err;
2106
2107 err = sock_error(sock->sk);
2108 if (err)
2109 goto out_put;
2110
2111 entry = mmsg;
d7256d0e 2112 compat_entry = (struct compat_mmsghdr __user *)mmsg;
a2e27255
ACM
2113
2114 while (datagrams < vlen) {
2115 /*
2116 * No need to ask LSM for more than the first datagram.
2117 */
d7256d0e
JMG
2118 if (MSG_CMSG_COMPAT & flags) {
2119 err = __sys_recvmsg(sock, (struct msghdr __user *)compat_entry,
2120 &msg_sys, flags, datagrams);
2121 if (err < 0)
2122 break;
2123 err = __put_user(err, &compat_entry->msg_len);
2124 ++compat_entry;
2125 } else {
2126 err = __sys_recvmsg(sock, (struct msghdr __user *)entry,
2127 &msg_sys, flags, datagrams);
2128 if (err < 0)
2129 break;
2130 err = put_user(err, &entry->msg_len);
2131 ++entry;
2132 }
2133
a2e27255
ACM
2134 if (err)
2135 break;
a2e27255
ACM
2136 ++datagrams;
2137
2138 if (timeout) {
2139 ktime_get_ts(timeout);
2140 *timeout = timespec_sub(end_time, *timeout);
2141 if (timeout->tv_sec < 0) {
2142 timeout->tv_sec = timeout->tv_nsec = 0;
2143 break;
2144 }
2145
2146 /* Timeout, return less than vlen datagrams */
2147 if (timeout->tv_nsec == 0 && timeout->tv_sec == 0)
2148 break;
2149 }
2150
2151 /* Out of band data, return right away */
2152 if (msg_sys.msg_flags & MSG_OOB)
2153 break;
2154 }
2155
2156out_put:
2157 fput_light(sock->file, fput_needed);
1da177e4 2158
a2e27255
ACM
2159 if (err == 0)
2160 return datagrams;
2161
2162 if (datagrams != 0) {
2163 /*
2164 * We may return less entries than requested (vlen) if the
2165 * sock is non block and there aren't enough datagrams...
2166 */
2167 if (err != -EAGAIN) {
2168 /*
2169 * ... or if recvmsg returns an error after we
2170 * received some datagrams, where we record the
2171 * error to return on the next call or if the
2172 * app asks about it using getsockopt(SO_ERROR).
2173 */
2174 sock->sk->sk_err = -err;
2175 }
2176
2177 return datagrams;
2178 }
2179
2180 return err;
2181}
2182
2183SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
2184 unsigned int, vlen, unsigned int, flags,
2185 struct timespec __user *, timeout)
2186{
2187 int datagrams;
2188 struct timespec timeout_sys;
2189
2190 if (!timeout)
2191 return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL);
2192
2193 if (copy_from_user(&timeout_sys, timeout, sizeof(timeout_sys)))
2194 return -EFAULT;
2195
2196 datagrams = __sys_recvmmsg(fd, mmsg, vlen, flags, &timeout_sys);
2197
2198 if (datagrams > 0 &&
2199 copy_to_user(timeout, &timeout_sys, sizeof(timeout_sys)))
2200 datagrams = -EFAULT;
2201
2202 return datagrams;
2203}
2204
2205#ifdef __ARCH_WANT_SYS_SOCKETCALL
1da177e4
LT
2206/* Argument list sizes for sys_socketcall */
2207#define AL(x) ((x) * sizeof(unsigned long))
a2e27255 2208static const unsigned char nargs[20] = {
89bddce5
SH
2209 AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
2210 AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
aaca0bdc 2211 AL(6),AL(2),AL(5),AL(5),AL(3),AL(3),
a2e27255 2212 AL(4),AL(5)
89bddce5
SH
2213};
2214
1da177e4
LT
2215#undef AL
2216
2217/*
89bddce5 2218 * System call vectors.
1da177e4
LT
2219 *
2220 * Argument checking cleaned up. Saved 20% in size.
2221 * This function doesn't need to set the kernel lock because
89bddce5 2222 * it is set by the callees.
1da177e4
LT
2223 */
2224
3e0fa65f 2225SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
1da177e4
LT
2226{
2227 unsigned long a[6];
89bddce5 2228 unsigned long a0, a1;
1da177e4 2229 int err;
47379052 2230 unsigned int len;
1da177e4 2231
a2e27255 2232 if (call < 1 || call > SYS_RECVMMSG)
1da177e4
LT
2233 return -EINVAL;
2234
47379052
AV
2235 len = nargs[call];
2236 if (len > sizeof(a))
2237 return -EINVAL;
2238
1da177e4 2239 /* copy_from_user should be SMP safe. */
47379052 2240 if (copy_from_user(a, args, len))
1da177e4 2241 return -EFAULT;
3ec3b2fb 2242
f3298dc4 2243 audit_socketcall(nargs[call] / sizeof(unsigned long), a);
3ec3b2fb 2244
89bddce5
SH
2245 a0 = a[0];
2246 a1 = a[1];
2247
2248 switch (call) {
2249 case SYS_SOCKET:
2250 err = sys_socket(a0, a1, a[2]);
2251 break;
2252 case SYS_BIND:
2253 err = sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
2254 break;
2255 case SYS_CONNECT:
2256 err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
2257 break;
2258 case SYS_LISTEN:
2259 err = sys_listen(a0, a1);
2260 break;
2261 case SYS_ACCEPT:
de11defe
UD
2262 err = sys_accept4(a0, (struct sockaddr __user *)a1,
2263 (int __user *)a[2], 0);
89bddce5
SH
2264 break;
2265 case SYS_GETSOCKNAME:
2266 err =
2267 sys_getsockname(a0, (struct sockaddr __user *)a1,
2268 (int __user *)a[2]);
2269 break;
2270 case SYS_GETPEERNAME:
2271 err =
2272 sys_getpeername(a0, (struct sockaddr __user *)a1,
2273 (int __user *)a[2]);
2274 break;
2275 case SYS_SOCKETPAIR:
2276 err = sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
2277 break;
2278 case SYS_SEND:
2279 err = sys_send(a0, (void __user *)a1, a[2], a[3]);
2280 break;
2281 case SYS_SENDTO:
2282 err = sys_sendto(a0, (void __user *)a1, a[2], a[3],
2283 (struct sockaddr __user *)a[4], a[5]);
2284 break;
2285 case SYS_RECV:
2286 err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
2287 break;
2288 case SYS_RECVFROM:
2289 err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
2290 (struct sockaddr __user *)a[4],
2291 (int __user *)a[5]);
2292 break;
2293 case SYS_SHUTDOWN:
2294 err = sys_shutdown(a0, a1);
2295 break;
2296 case SYS_SETSOCKOPT:
2297 err = sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]);
2298 break;
2299 case SYS_GETSOCKOPT:
2300 err =
2301 sys_getsockopt(a0, a1, a[2], (char __user *)a[3],
2302 (int __user *)a[4]);
2303 break;
2304 case SYS_SENDMSG:
2305 err = sys_sendmsg(a0, (struct msghdr __user *)a1, a[2]);
2306 break;
2307 case SYS_RECVMSG:
2308 err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]);
2309 break;
a2e27255
ACM
2310 case SYS_RECVMMSG:
2311 err = sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3],
2312 (struct timespec __user *)a[4]);
2313 break;
de11defe
UD
2314 case SYS_ACCEPT4:
2315 err = sys_accept4(a0, (struct sockaddr __user *)a1,
2316 (int __user *)a[2], a[3]);
aaca0bdc 2317 break;
89bddce5
SH
2318 default:
2319 err = -EINVAL;
2320 break;
1da177e4
LT
2321 }
2322 return err;
2323}
2324
89bddce5 2325#endif /* __ARCH_WANT_SYS_SOCKETCALL */
1da177e4 2326
55737fda
SH
2327/**
2328 * sock_register - add a socket protocol handler
2329 * @ops: description of protocol
2330 *
1da177e4
LT
2331 * This function is called by a protocol handler that wants to
2332 * advertise its address family, and have it linked into the
55737fda
SH
2333 * socket interface. The value ops->family coresponds to the
2334 * socket system call protocol family.
1da177e4 2335 */
f0fd27d4 2336int sock_register(const struct net_proto_family *ops)
1da177e4
LT
2337{
2338 int err;
2339
2340 if (ops->family >= NPROTO) {
89bddce5
SH
2341 printk(KERN_CRIT "protocol %d >= NPROTO(%d)\n", ops->family,
2342 NPROTO);
1da177e4
LT
2343 return -ENOBUFS;
2344 }
55737fda
SH
2345
2346 spin_lock(&net_family_lock);
2347 if (net_families[ops->family])
2348 err = -EEXIST;
2349 else {
89bddce5 2350 net_families[ops->family] = ops;
1da177e4
LT
2351 err = 0;
2352 }
55737fda
SH
2353 spin_unlock(&net_family_lock);
2354
89bddce5 2355 printk(KERN_INFO "NET: Registered protocol family %d\n", ops->family);
1da177e4
LT
2356 return err;
2357}
2358
55737fda
SH
2359/**
2360 * sock_unregister - remove a protocol handler
2361 * @family: protocol family to remove
2362 *
1da177e4
LT
2363 * This function is called by a protocol handler that wants to
2364 * remove its address family, and have it unlinked from the
55737fda
SH
2365 * new socket creation.
2366 *
2367 * If protocol handler is a module, then it can use module reference
2368 * counts to protect against new references. If protocol handler is not
2369 * a module then it needs to provide its own protection in
2370 * the ops->create routine.
1da177e4 2371 */
f0fd27d4 2372void sock_unregister(int family)
1da177e4 2373{
f0fd27d4 2374 BUG_ON(family < 0 || family >= NPROTO);
1da177e4 2375
55737fda 2376 spin_lock(&net_family_lock);
89bddce5 2377 net_families[family] = NULL;
55737fda
SH
2378 spin_unlock(&net_family_lock);
2379
2380 synchronize_rcu();
2381
89bddce5 2382 printk(KERN_INFO "NET: Unregistered protocol family %d\n", family);
1da177e4
LT
2383}
2384
77d76ea3 2385static int __init sock_init(void)
1da177e4
LT
2386{
2387 /*
89bddce5 2388 * Initialize sock SLAB cache.
1da177e4 2389 */
89bddce5 2390
1da177e4
LT
2391 sk_init();
2392
1da177e4 2393 /*
89bddce5 2394 * Initialize skbuff SLAB cache
1da177e4
LT
2395 */
2396 skb_init();
1da177e4
LT
2397
2398 /*
89bddce5 2399 * Initialize the protocols module.
1da177e4
LT
2400 */
2401
2402 init_inodecache();
2403 register_filesystem(&sock_fs_type);
2404 sock_mnt = kern_mount(&sock_fs_type);
77d76ea3
AK
2405
2406 /* The real protocol initialization is performed in later initcalls.
1da177e4
LT
2407 */
2408
2409#ifdef CONFIG_NETFILTER
2410 netfilter_init();
2411#endif
cbeb321a
DM
2412
2413 return 0;
1da177e4
LT
2414}
2415
77d76ea3
AK
2416core_initcall(sock_init); /* early initcall */
2417
1da177e4
LT
2418#ifdef CONFIG_PROC_FS
2419void socket_seq_show(struct seq_file *seq)
2420{
2421 int cpu;
2422 int counter = 0;
2423
6f912042 2424 for_each_possible_cpu(cpu)
89bddce5 2425 counter += per_cpu(sockets_in_use, cpu);
1da177e4
LT
2426
2427 /* It can be negative, by the way. 8) */
2428 if (counter < 0)
2429 counter = 0;
2430
2431 seq_printf(seq, "sockets: used %d\n", counter);
2432}
89bddce5 2433#endif /* CONFIG_PROC_FS */
1da177e4 2434
89bbfc95 2435#ifdef CONFIG_COMPAT
6b96018b
AB
2436static int do_siocgstamp(struct net *net, struct socket *sock,
2437 unsigned int cmd, struct compat_timeval __user *up)
7a229387 2438{
7a229387
AB
2439 mm_segment_t old_fs = get_fs();
2440 struct timeval ktv;
2441 int err;
2442
2443 set_fs(KERNEL_DS);
6b96018b 2444 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv);
7a229387
AB
2445 set_fs(old_fs);
2446 if (!err) {
2447 err = put_user(ktv.tv_sec, &up->tv_sec);
2448 err |= __put_user(ktv.tv_usec, &up->tv_usec);
2449 }
2450 return err;
2451}
2452
6b96018b
AB
2453static int do_siocgstampns(struct net *net, struct socket *sock,
2454 unsigned int cmd, struct compat_timespec __user *up)
7a229387 2455{
7a229387
AB
2456 mm_segment_t old_fs = get_fs();
2457 struct timespec kts;
2458 int err;
2459
2460 set_fs(KERNEL_DS);
6b96018b 2461 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts);
7a229387
AB
2462 set_fs(old_fs);
2463 if (!err) {
2464 err = put_user(kts.tv_sec, &up->tv_sec);
2465 err |= __put_user(kts.tv_nsec, &up->tv_nsec);
2466 }
2467 return err;
2468}
2469
6b96018b 2470static int dev_ifname32(struct net *net, struct compat_ifreq __user *uifr32)
7a229387
AB
2471{
2472 struct ifreq __user *uifr;
2473 int err;
2474
2475 uifr = compat_alloc_user_space(sizeof(struct ifreq));
6b96018b 2476 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq)))
7a229387
AB
2477 return -EFAULT;
2478
6b96018b 2479 err = dev_ioctl(net, SIOCGIFNAME, uifr);
7a229387
AB
2480 if (err)
2481 return err;
2482
6b96018b 2483 if (copy_in_user(uifr32, uifr, sizeof(struct compat_ifreq)))
7a229387
AB
2484 return -EFAULT;
2485
2486 return 0;
2487}
2488
6b96018b 2489static int dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32)
7a229387 2490{
6b96018b 2491 struct compat_ifconf ifc32;
7a229387
AB
2492 struct ifconf ifc;
2493 struct ifconf __user *uifc;
6b96018b 2494 struct compat_ifreq __user *ifr32;
7a229387
AB
2495 struct ifreq __user *ifr;
2496 unsigned int i, j;
2497 int err;
2498
6b96018b 2499 if (copy_from_user(&ifc32, uifc32, sizeof(struct compat_ifconf)))
7a229387
AB
2500 return -EFAULT;
2501
2502 if (ifc32.ifcbuf == 0) {
2503 ifc32.ifc_len = 0;
2504 ifc.ifc_len = 0;
2505 ifc.ifc_req = NULL;
2506 uifc = compat_alloc_user_space(sizeof(struct ifconf));
2507 } else {
6b96018b 2508 size_t len =((ifc32.ifc_len / sizeof (struct compat_ifreq)) + 1) *
7a229387
AB
2509 sizeof (struct ifreq);
2510 uifc = compat_alloc_user_space(sizeof(struct ifconf) + len);
2511 ifc.ifc_len = len;
2512 ifr = ifc.ifc_req = (void __user *)(uifc + 1);
2513 ifr32 = compat_ptr(ifc32.ifcbuf);
6b96018b
AB
2514 for (i = 0; i < ifc32.ifc_len; i += sizeof (struct compat_ifreq)) {
2515 if (copy_in_user(ifr, ifr32, sizeof(struct compat_ifreq)))
7a229387
AB
2516 return -EFAULT;
2517 ifr++;
2518 ifr32++;
2519 }
2520 }
2521 if (copy_to_user(uifc, &ifc, sizeof(struct ifconf)))
2522 return -EFAULT;
2523
6b96018b 2524 err = dev_ioctl(net, SIOCGIFCONF, uifc);
7a229387
AB
2525 if (err)
2526 return err;
2527
2528 if (copy_from_user(&ifc, uifc, sizeof(struct ifconf)))
2529 return -EFAULT;
2530
2531 ifr = ifc.ifc_req;
2532 ifr32 = compat_ptr(ifc32.ifcbuf);
2533 for (i = 0, j = 0;
6b96018b
AB
2534 i + sizeof (struct compat_ifreq) <= ifc32.ifc_len && j < ifc.ifc_len;
2535 i += sizeof (struct compat_ifreq), j += sizeof (struct ifreq)) {
2536 if (copy_in_user(ifr32, ifr, sizeof (struct compat_ifreq)))
7a229387
AB
2537 return -EFAULT;
2538 ifr32++;
2539 ifr++;
2540 }
2541
2542 if (ifc32.ifcbuf == 0) {
2543 /* Translate from 64-bit structure multiple to
2544 * a 32-bit one.
2545 */
2546 i = ifc.ifc_len;
6b96018b 2547 i = ((i / sizeof(struct ifreq)) * sizeof(struct compat_ifreq));
7a229387
AB
2548 ifc32.ifc_len = i;
2549 } else {
2550 ifc32.ifc_len = i;
2551 }
6b96018b 2552 if (copy_to_user(uifc32, &ifc32, sizeof(struct compat_ifconf)))
7a229387
AB
2553 return -EFAULT;
2554
2555 return 0;
2556}
2557
6b96018b 2558static int ethtool_ioctl(struct net *net, struct compat_ifreq __user *ifr32)
7a229387
AB
2559{
2560 struct ifreq __user *ifr;
7a229387
AB
2561 u32 data;
2562 void __user *datap;
2563
2564 ifr = compat_alloc_user_space(sizeof(*ifr));
7a229387
AB
2565
2566 if (copy_in_user(&ifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ))
2567 return -EFAULT;
2568
2569 if (get_user(data, &ifr32->ifr_ifru.ifru_data))
2570 return -EFAULT;
2571
2572 datap = compat_ptr(data);
2573 if (put_user(datap, &ifr->ifr_ifru.ifru_data))
2574 return -EFAULT;
2575
6b96018b 2576 return dev_ioctl(net, SIOCETHTOOL, ifr);
7a229387
AB
2577}
2578
7a50a240
AB
2579static int compat_siocwandev(struct net *net, struct compat_ifreq __user *uifr32)
2580{
2581 void __user *uptr;
2582 compat_uptr_t uptr32;
2583 struct ifreq __user *uifr;
2584
2585 uifr = compat_alloc_user_space(sizeof (*uifr));
2586 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq)))
2587 return -EFAULT;
2588
2589 if (get_user(uptr32, &uifr32->ifr_settings.ifs_ifsu))
2590 return -EFAULT;
2591
2592 uptr = compat_ptr(uptr32);
2593
2594 if (put_user(uptr, &uifr->ifr_settings.ifs_ifsu.raw_hdlc))
2595 return -EFAULT;
2596
2597 return dev_ioctl(net, SIOCWANDEV, uifr);
2598}
2599
6b96018b
AB
2600static int bond_ioctl(struct net *net, unsigned int cmd,
2601 struct compat_ifreq __user *ifr32)
7a229387
AB
2602{
2603 struct ifreq kifr;
2604 struct ifreq __user *uifr;
7a229387
AB
2605 mm_segment_t old_fs;
2606 int err;
2607 u32 data;
2608 void __user *datap;
2609
2610 switch (cmd) {
2611 case SIOCBONDENSLAVE:
2612 case SIOCBONDRELEASE:
2613 case SIOCBONDSETHWADDR:
2614 case SIOCBONDCHANGEACTIVE:
6b96018b 2615 if (copy_from_user(&kifr, ifr32, sizeof(struct compat_ifreq)))
7a229387
AB
2616 return -EFAULT;
2617
2618 old_fs = get_fs();
2619 set_fs (KERNEL_DS);
6b96018b 2620 err = dev_ioctl(net, cmd, &kifr);
7a229387
AB
2621 set_fs (old_fs);
2622
2623 return err;
2624 case SIOCBONDSLAVEINFOQUERY:
2625 case SIOCBONDINFOQUERY:
2626 uifr = compat_alloc_user_space(sizeof(*uifr));
2627 if (copy_in_user(&uifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ))
2628 return -EFAULT;
2629
2630 if (get_user(data, &ifr32->ifr_ifru.ifru_data))
2631 return -EFAULT;
2632
2633 datap = compat_ptr(data);
2634 if (put_user(datap, &uifr->ifr_ifru.ifru_data))
2635 return -EFAULT;
2636
6b96018b 2637 return dev_ioctl(net, cmd, uifr);
7a229387
AB
2638 default:
2639 return -EINVAL;
2640 };
2641}
2642
6b96018b
AB
2643static int siocdevprivate_ioctl(struct net *net, unsigned int cmd,
2644 struct compat_ifreq __user *u_ifreq32)
7a229387
AB
2645{
2646 struct ifreq __user *u_ifreq64;
7a229387
AB
2647 char tmp_buf[IFNAMSIZ];
2648 void __user *data64;
2649 u32 data32;
2650
2651 if (copy_from_user(&tmp_buf[0], &(u_ifreq32->ifr_ifrn.ifrn_name[0]),
2652 IFNAMSIZ))
2653 return -EFAULT;
2654 if (__get_user(data32, &u_ifreq32->ifr_ifru.ifru_data))
2655 return -EFAULT;
2656 data64 = compat_ptr(data32);
2657
2658 u_ifreq64 = compat_alloc_user_space(sizeof(*u_ifreq64));
2659
2660 /* Don't check these user accesses, just let that get trapped
2661 * in the ioctl handler instead.
2662 */
2663 if (copy_to_user(&u_ifreq64->ifr_ifrn.ifrn_name[0], &tmp_buf[0],
2664 IFNAMSIZ))
2665 return -EFAULT;
2666 if (__put_user(data64, &u_ifreq64->ifr_ifru.ifru_data))
2667 return -EFAULT;
2668
6b96018b 2669 return dev_ioctl(net, cmd, u_ifreq64);
7a229387
AB
2670}
2671
6b96018b
AB
2672static int dev_ifsioc(struct net *net, struct socket *sock,
2673 unsigned int cmd, struct compat_ifreq __user *uifr32)
7a229387 2674{
a2116ed2 2675 struct ifreq __user *uifr;
7a229387
AB
2676 int err;
2677
a2116ed2
AB
2678 uifr = compat_alloc_user_space(sizeof(*uifr));
2679 if (copy_in_user(uifr, uifr32, sizeof(*uifr32)))
2680 return -EFAULT;
2681
2682 err = sock_do_ioctl(net, sock, cmd, (unsigned long)uifr);
2683
7a229387
AB
2684 if (!err) {
2685 switch (cmd) {
2686 case SIOCGIFFLAGS:
2687 case SIOCGIFMETRIC:
2688 case SIOCGIFMTU:
2689 case SIOCGIFMEM:
2690 case SIOCGIFHWADDR:
2691 case SIOCGIFINDEX:
2692 case SIOCGIFADDR:
2693 case SIOCGIFBRDADDR:
2694 case SIOCGIFDSTADDR:
2695 case SIOCGIFNETMASK:
fab2532b 2696 case SIOCGIFPFLAGS:
7a229387 2697 case SIOCGIFTXQLEN:
fab2532b
AB
2698 case SIOCGMIIPHY:
2699 case SIOCGMIIREG:
a2116ed2 2700 if (copy_in_user(uifr32, uifr, sizeof(*uifr32)))
7a229387
AB
2701 err = -EFAULT;
2702 break;
2703 }
2704 }
2705 return err;
2706}
2707
a2116ed2
AB
2708static int compat_sioc_ifmap(struct net *net, unsigned int cmd,
2709 struct compat_ifreq __user *uifr32)
2710{
2711 struct ifreq ifr;
2712 struct compat_ifmap __user *uifmap32;
2713 mm_segment_t old_fs;
2714 int err;
2715
2716 uifmap32 = &uifr32->ifr_ifru.ifru_map;
2717 err = copy_from_user(&ifr, uifr32, sizeof(ifr.ifr_name));
2718 err |= __get_user(ifr.ifr_map.mem_start, &uifmap32->mem_start);
2719 err |= __get_user(ifr.ifr_map.mem_end, &uifmap32->mem_end);
2720 err |= __get_user(ifr.ifr_map.base_addr, &uifmap32->base_addr);
2721 err |= __get_user(ifr.ifr_map.irq, &uifmap32->irq);
2722 err |= __get_user(ifr.ifr_map.dma, &uifmap32->dma);
2723 err |= __get_user(ifr.ifr_map.port, &uifmap32->port);
2724 if (err)
2725 return -EFAULT;
2726
2727 old_fs = get_fs();
2728 set_fs (KERNEL_DS);
2729 err = dev_ioctl(net, cmd, (void __user *)&ifr);
2730 set_fs (old_fs);
2731
2732 if (cmd == SIOCGIFMAP && !err) {
2733 err = copy_to_user(uifr32, &ifr, sizeof(ifr.ifr_name));
2734 err |= __put_user(ifr.ifr_map.mem_start, &uifmap32->mem_start);
2735 err |= __put_user(ifr.ifr_map.mem_end, &uifmap32->mem_end);
2736 err |= __put_user(ifr.ifr_map.base_addr, &uifmap32->base_addr);
2737 err |= __put_user(ifr.ifr_map.irq, &uifmap32->irq);
2738 err |= __put_user(ifr.ifr_map.dma, &uifmap32->dma);
2739 err |= __put_user(ifr.ifr_map.port, &uifmap32->port);
2740 if (err)
2741 err = -EFAULT;
2742 }
2743 return err;
2744}
2745
2746static int compat_siocshwtstamp(struct net *net, struct compat_ifreq __user *uifr32)
2747{
2748 void __user *uptr;
2749 compat_uptr_t uptr32;
2750 struct ifreq __user *uifr;
2751
2752 uifr = compat_alloc_user_space(sizeof (*uifr));
2753 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq)))
2754 return -EFAULT;
2755
2756 if (get_user(uptr32, &uifr32->ifr_data))
2757 return -EFAULT;
2758
2759 uptr = compat_ptr(uptr32);
2760
2761 if (put_user(uptr, &uifr->ifr_data))
2762 return -EFAULT;
2763
2764 return dev_ioctl(net, SIOCSHWTSTAMP, uifr);
2765}
2766
7a229387
AB
2767struct rtentry32 {
2768 u32 rt_pad1;
2769 struct sockaddr rt_dst; /* target address */
2770 struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
2771 struct sockaddr rt_genmask; /* target network mask (IP) */
2772 unsigned short rt_flags;
2773 short rt_pad2;
2774 u32 rt_pad3;
2775 unsigned char rt_tos;
2776 unsigned char rt_class;
2777 short rt_pad4;
2778 short rt_metric; /* +1 for binary compatibility! */
2779 /* char * */ u32 rt_dev; /* forcing the device at add */
2780 u32 rt_mtu; /* per route MTU/Window */
2781 u32 rt_window; /* Window clamping */
2782 unsigned short rt_irtt; /* Initial RTT */
2783};
2784
2785struct in6_rtmsg32 {
2786 struct in6_addr rtmsg_dst;
2787 struct in6_addr rtmsg_src;
2788 struct in6_addr rtmsg_gateway;
2789 u32 rtmsg_type;
2790 u16 rtmsg_dst_len;
2791 u16 rtmsg_src_len;
2792 u32 rtmsg_metric;
2793 u32 rtmsg_info;
2794 u32 rtmsg_flags;
2795 s32 rtmsg_ifindex;
2796};
2797
6b96018b
AB
2798static int routing_ioctl(struct net *net, struct socket *sock,
2799 unsigned int cmd, void __user *argp)
7a229387
AB
2800{
2801 int ret;
2802 void *r = NULL;
2803 struct in6_rtmsg r6;
2804 struct rtentry r4;
2805 char devname[16];
2806 u32 rtdev;
2807 mm_segment_t old_fs = get_fs();
2808
6b96018b
AB
2809 if (sock && sock->sk && sock->sk->sk_family == AF_INET6) { /* ipv6 */
2810 struct in6_rtmsg32 __user *ur6 = argp;
7a229387
AB
2811 ret = copy_from_user (&r6.rtmsg_dst, &(ur6->rtmsg_dst),
2812 3 * sizeof(struct in6_addr));
2813 ret |= __get_user (r6.rtmsg_type, &(ur6->rtmsg_type));
2814 ret |= __get_user (r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len));
2815 ret |= __get_user (r6.rtmsg_src_len, &(ur6->rtmsg_src_len));
2816 ret |= __get_user (r6.rtmsg_metric, &(ur6->rtmsg_metric));
2817 ret |= __get_user (r6.rtmsg_info, &(ur6->rtmsg_info));
2818 ret |= __get_user (r6.rtmsg_flags, &(ur6->rtmsg_flags));
2819 ret |= __get_user (r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex));
2820
2821 r = (void *) &r6;
2822 } else { /* ipv4 */
6b96018b 2823 struct rtentry32 __user *ur4 = argp;
7a229387
AB
2824 ret = copy_from_user (&r4.rt_dst, &(ur4->rt_dst),
2825 3 * sizeof(struct sockaddr));
2826 ret |= __get_user (r4.rt_flags, &(ur4->rt_flags));
2827 ret |= __get_user (r4.rt_metric, &(ur4->rt_metric));
2828 ret |= __get_user (r4.rt_mtu, &(ur4->rt_mtu));
2829 ret |= __get_user (r4.rt_window, &(ur4->rt_window));
2830 ret |= __get_user (r4.rt_irtt, &(ur4->rt_irtt));
2831 ret |= __get_user (rtdev, &(ur4->rt_dev));
2832 if (rtdev) {
2833 ret |= copy_from_user (devname, compat_ptr(rtdev), 15);
2834 r4.rt_dev = devname; devname[15] = 0;
2835 } else
2836 r4.rt_dev = NULL;
2837
2838 r = (void *) &r4;
2839 }
2840
2841 if (ret) {
2842 ret = -EFAULT;
2843 goto out;
2844 }
2845
2846 set_fs (KERNEL_DS);
6b96018b 2847 ret = sock_do_ioctl(net, sock, cmd, (unsigned long) r);
7a229387
AB
2848 set_fs (old_fs);
2849
2850out:
7a229387
AB
2851 return ret;
2852}
2853
2854/* Since old style bridge ioctl's endup using SIOCDEVPRIVATE
2855 * for some operations; this forces use of the newer bridge-utils that
2856 * use compatiable ioctls
2857 */
6b96018b 2858static int old_bridge_ioctl(compat_ulong_t __user *argp)
7a229387 2859{
6b96018b 2860 compat_ulong_t tmp;
7a229387 2861
6b96018b 2862 if (get_user(tmp, argp))
7a229387
AB
2863 return -EFAULT;
2864 if (tmp == BRCTL_GET_VERSION)
2865 return BRCTL_VERSION + 1;
2866 return -EINVAL;
2867}
2868
6b96018b
AB
2869static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
2870 unsigned int cmd, unsigned long arg)
2871{
2872 void __user *argp = compat_ptr(arg);
2873 struct sock *sk = sock->sk;
2874 struct net *net = sock_net(sk);
7a229387 2875
6b96018b
AB
2876 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15))
2877 return siocdevprivate_ioctl(net, cmd, argp);
2878
2879 switch (cmd) {
2880 case SIOCSIFBR:
2881 case SIOCGIFBR:
2882 return old_bridge_ioctl(argp);
2883 case SIOCGIFNAME:
2884 return dev_ifname32(net, argp);
2885 case SIOCGIFCONF:
2886 return dev_ifconf(net, argp);
2887 case SIOCETHTOOL:
2888 return ethtool_ioctl(net, argp);
7a50a240
AB
2889 case SIOCWANDEV:
2890 return compat_siocwandev(net, argp);
a2116ed2
AB
2891 case SIOCGIFMAP:
2892 case SIOCSIFMAP:
2893 return compat_sioc_ifmap(net, cmd, argp);
6b96018b
AB
2894 case SIOCBONDENSLAVE:
2895 case SIOCBONDRELEASE:
2896 case SIOCBONDSETHWADDR:
2897 case SIOCBONDSLAVEINFOQUERY:
2898 case SIOCBONDINFOQUERY:
2899 case SIOCBONDCHANGEACTIVE:
2900 return bond_ioctl(net, cmd, argp);
2901 case SIOCADDRT:
2902 case SIOCDELRT:
2903 return routing_ioctl(net, sock, cmd, argp);
2904 case SIOCGSTAMP:
2905 return do_siocgstamp(net, sock, cmd, argp);
2906 case SIOCGSTAMPNS:
2907 return do_siocgstampns(net, sock, cmd, argp);
a2116ed2
AB
2908 case SIOCSHWTSTAMP:
2909 return compat_siocshwtstamp(net, argp);
6b96018b
AB
2910
2911 case FIOSETOWN:
2912 case SIOCSPGRP:
2913 case FIOGETOWN:
2914 case SIOCGPGRP:
2915 case SIOCBRADDBR:
2916 case SIOCBRDELBR:
2917 case SIOCGIFVLAN:
2918 case SIOCSIFVLAN:
2919 case SIOCADDDLCI:
2920 case SIOCDELDLCI:
2921 return sock_ioctl(file, cmd, arg);
2922
2923 case SIOCGIFFLAGS:
2924 case SIOCSIFFLAGS:
2925 case SIOCGIFMETRIC:
2926 case SIOCSIFMETRIC:
2927 case SIOCGIFMTU:
2928 case SIOCSIFMTU:
2929 case SIOCGIFMEM:
2930 case SIOCSIFMEM:
2931 case SIOCGIFHWADDR:
2932 case SIOCSIFHWADDR:
2933 case SIOCADDMULTI:
2934 case SIOCDELMULTI:
2935 case SIOCGIFINDEX:
6b96018b
AB
2936 case SIOCGIFADDR:
2937 case SIOCSIFADDR:
2938 case SIOCSIFHWBROADCAST:
6b96018b 2939 case SIOCDIFADDR:
6b96018b
AB
2940 case SIOCGIFBRDADDR:
2941 case SIOCSIFBRDADDR:
2942 case SIOCGIFDSTADDR:
2943 case SIOCSIFDSTADDR:
2944 case SIOCGIFNETMASK:
2945 case SIOCSIFNETMASK:
2946 case SIOCSIFPFLAGS:
2947 case SIOCGIFPFLAGS:
2948 case SIOCGIFTXQLEN:
2949 case SIOCSIFTXQLEN:
2950 case SIOCBRADDIF:
2951 case SIOCBRDELIF:
9177efd3
AB
2952 case SIOCSIFNAME:
2953 case SIOCGMIIPHY:
2954 case SIOCGMIIREG:
2955 case SIOCSMIIREG:
6b96018b 2956 return dev_ifsioc(net, sock, cmd, argp);
9177efd3 2957
6b96018b
AB
2958 case SIOCSARP:
2959 case SIOCGARP:
2960 case SIOCDARP:
6b96018b 2961 case SIOCATMARK:
9177efd3
AB
2962 return sock_do_ioctl(net, sock, cmd, arg);
2963 }
2964
2965 /* Prevent warning from compat_sys_ioctl, these always
2966 * result in -EINVAL in the native case anyway. */
2967 switch (cmd) {
2968 case SIOCRTMSG:
2969 case SIOCGIFCOUNT:
6b96018b
AB
2970 case SIOCSRARP:
2971 case SIOCGRARP:
2972 case SIOCDRARP:
9177efd3
AB
2973 case SIOCSIFLINK:
2974 case SIOCGIFSLAVE:
2975 case SIOCSIFSLAVE:
2976 return -EINVAL;
6b96018b
AB
2977 }
2978
2979 return -ENOIOCTLCMD;
2980}
7a229387 2981
89bbfc95 2982static long compat_sock_ioctl(struct file *file, unsigned cmd,
89bddce5 2983 unsigned long arg)
89bbfc95
SP
2984{
2985 struct socket *sock = file->private_data;
2986 int ret = -ENOIOCTLCMD;
87de87d5
DM
2987 struct sock *sk;
2988 struct net *net;
2989
2990 sk = sock->sk;
2991 net = sock_net(sk);
89bbfc95
SP
2992
2993 if (sock->ops->compat_ioctl)
2994 ret = sock->ops->compat_ioctl(sock, cmd, arg);
2995
87de87d5
DM
2996 if (ret == -ENOIOCTLCMD &&
2997 (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST))
2998 ret = compat_wext_handle_ioctl(net, cmd, arg);
2999
6b96018b
AB
3000 if (ret == -ENOIOCTLCMD)
3001 ret = compat_sock_ioctl_trans(file, sock, cmd, arg);
3002
89bbfc95
SP
3003 return ret;
3004}
3005#endif
3006
ac5a488e
SS
3007int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
3008{
3009 return sock->ops->bind(sock, addr, addrlen);
3010}
3011
3012int kernel_listen(struct socket *sock, int backlog)
3013{
3014 return sock->ops->listen(sock, backlog);
3015}
3016
3017int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
3018{
3019 struct sock *sk = sock->sk;
3020 int err;
3021
3022 err = sock_create_lite(sk->sk_family, sk->sk_type, sk->sk_protocol,
3023 newsock);
3024 if (err < 0)
3025 goto done;
3026
3027 err = sock->ops->accept(sock, *newsock, flags);
3028 if (err < 0) {
3029 sock_release(*newsock);
fa8705b0 3030 *newsock = NULL;
ac5a488e
SS
3031 goto done;
3032 }
3033
3034 (*newsock)->ops = sock->ops;
1b08534e 3035 __module_get((*newsock)->ops->owner);
ac5a488e
SS
3036
3037done:
3038 return err;
3039}
3040
3041int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
4768fbcb 3042 int flags)
ac5a488e
SS
3043{
3044 return sock->ops->connect(sock, addr, addrlen, flags);
3045}
3046
3047int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
3048 int *addrlen)
3049{
3050 return sock->ops->getname(sock, addr, addrlen, 0);
3051}
3052
3053int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
3054 int *addrlen)
3055{
3056 return sock->ops->getname(sock, addr, addrlen, 1);
3057}
3058
3059int kernel_getsockopt(struct socket *sock, int level, int optname,
3060 char *optval, int *optlen)
3061{
3062 mm_segment_t oldfs = get_fs();
3063 int err;
3064
3065 set_fs(KERNEL_DS);
3066 if (level == SOL_SOCKET)
3067 err = sock_getsockopt(sock, level, optname, optval, optlen);
3068 else
3069 err = sock->ops->getsockopt(sock, level, optname, optval,
3070 optlen);
3071 set_fs(oldfs);
3072 return err;
3073}
3074
3075int kernel_setsockopt(struct socket *sock, int level, int optname,
b7058842 3076 char *optval, unsigned int optlen)
ac5a488e
SS
3077{
3078 mm_segment_t oldfs = get_fs();
3079 int err;
3080
3081 set_fs(KERNEL_DS);
3082 if (level == SOL_SOCKET)
3083 err = sock_setsockopt(sock, level, optname, optval, optlen);
3084 else
3085 err = sock->ops->setsockopt(sock, level, optname, optval,
3086 optlen);
3087 set_fs(oldfs);
3088 return err;
3089}
3090
3091int kernel_sendpage(struct socket *sock, struct page *page, int offset,
3092 size_t size, int flags)
3093{
3094 if (sock->ops->sendpage)
3095 return sock->ops->sendpage(sock, page, offset, size, flags);
3096
3097 return sock_no_sendpage(sock, page, offset, size, flags);
3098}
3099
3100int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg)
3101{
3102 mm_segment_t oldfs = get_fs();
3103 int err;
3104
3105 set_fs(KERNEL_DS);
3106 err = sock->ops->ioctl(sock, cmd, arg);
3107 set_fs(oldfs);
3108
3109 return err;
3110}
3111
91cf45f0
TM
3112int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how)
3113{
3114 return sock->ops->shutdown(sock, how);
3115}
3116
1da177e4
LT
3117EXPORT_SYMBOL(sock_create);
3118EXPORT_SYMBOL(sock_create_kern);
3119EXPORT_SYMBOL(sock_create_lite);
3120EXPORT_SYMBOL(sock_map_fd);
3121EXPORT_SYMBOL(sock_recvmsg);
3122EXPORT_SYMBOL(sock_register);
3123EXPORT_SYMBOL(sock_release);
3124EXPORT_SYMBOL(sock_sendmsg);
3125EXPORT_SYMBOL(sock_unregister);
3126EXPORT_SYMBOL(sock_wake_async);
3127EXPORT_SYMBOL(sockfd_lookup);
3128EXPORT_SYMBOL(kernel_sendmsg);
3129EXPORT_SYMBOL(kernel_recvmsg);
ac5a488e
SS
3130EXPORT_SYMBOL(kernel_bind);
3131EXPORT_SYMBOL(kernel_listen);
3132EXPORT_SYMBOL(kernel_accept);
3133EXPORT_SYMBOL(kernel_connect);
3134EXPORT_SYMBOL(kernel_getsockname);
3135EXPORT_SYMBOL(kernel_getpeername);
3136EXPORT_SYMBOL(kernel_getsockopt);
3137EXPORT_SYMBOL(kernel_setsockopt);
3138EXPORT_SYMBOL(kernel_sendpage);
3139EXPORT_SYMBOL(kernel_sock_ioctl);
91cf45f0 3140EXPORT_SYMBOL(kernel_sock_shutdown);