aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2011-01-13 01:06:28 -0500
committerPaul Mundt <lethal@linux-sh.org>2011-01-13 01:06:28 -0500
commitf43dc23d5ea91fca257be02138a255f02d98e806 (patch)
treeb29722f6e965316e90ac97abf79923ced250dc21 /net/socket.c
parentf8e53553f452dcbf67cb89c8cba63a1cd6eb4cc0 (diff)
parent4162cf64973df51fc885825bc9ca4d055891c49f (diff)
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6 into common/serial-rework
Conflicts: arch/sh/kernel/cpu/sh2/setup-sh7619.c arch/sh/kernel/cpu/sh2a/setup-mxg.c arch/sh/kernel/cpu/sh2a/setup-sh7201.c arch/sh/kernel/cpu/sh2a/setup-sh7203.c arch/sh/kernel/cpu/sh2a/setup-sh7206.c arch/sh/kernel/cpu/sh3/setup-sh7705.c arch/sh/kernel/cpu/sh3/setup-sh770x.c arch/sh/kernel/cpu/sh3/setup-sh7710.c arch/sh/kernel/cpu/sh3/setup-sh7720.c arch/sh/kernel/cpu/sh4/setup-sh4-202.c arch/sh/kernel/cpu/sh4/setup-sh7750.c arch/sh/kernel/cpu/sh4/setup-sh7760.c arch/sh/kernel/cpu/sh4a/setup-sh7343.c arch/sh/kernel/cpu/sh4a/setup-sh7366.c arch/sh/kernel/cpu/sh4a/setup-sh7722.c arch/sh/kernel/cpu/sh4a/setup-sh7723.c arch/sh/kernel/cpu/sh4a/setup-sh7724.c arch/sh/kernel/cpu/sh4a/setup-sh7763.c arch/sh/kernel/cpu/sh4a/setup-sh7770.c arch/sh/kernel/cpu/sh4a/setup-sh7780.c arch/sh/kernel/cpu/sh4a/setup-sh7785.c arch/sh/kernel/cpu/sh4a/setup-sh7786.c arch/sh/kernel/cpu/sh4a/setup-shx3.c arch/sh/kernel/cpu/sh5/setup-sh5.c drivers/serial/sh-sci.c drivers/serial/sh-sci.h include/linux/serial_sci.h
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c1305
1 files changed, 1007 insertions, 298 deletions
diff --git a/net/socket.c b/net/socket.c
index 791d71a36a93..ccc576a6a508 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -86,16 +86,25 @@
86#include <linux/audit.h> 86#include <linux/audit.h>
87#include <linux/wireless.h> 87#include <linux/wireless.h>
88#include <linux/nsproxy.h> 88#include <linux/nsproxy.h>
89#include <linux/magic.h>
90#include <linux/slab.h>
89 91
90#include <asm/uaccess.h> 92#include <asm/uaccess.h>
91#include <asm/unistd.h> 93#include <asm/unistd.h>
92 94
93#include <net/compat.h> 95#include <net/compat.h>
94#include <net/wext.h> 96#include <net/wext.h>
97#include <net/cls_cgroup.h>
95 98
96#include <net/sock.h> 99#include <net/sock.h>
97#include <linux/netfilter.h> 100#include <linux/netfilter.h>
98 101
102#include <linux/if_tun.h>
103#include <linux/ipv6_route.h>
104#include <linux/route.h>
105#include <linux/sockios.h>
106#include <linux/atalk.h>
107
99static int sock_no_open(struct inode *irrelevant, struct file *dontcare); 108static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
100static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov, 109static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
101 unsigned long nr_segs, loff_t pos); 110 unsigned long nr_segs, loff_t pos);
@@ -115,7 +124,7 @@ static int sock_fasync(int fd, struct file *filp, int on);
115static ssize_t sock_sendpage(struct file *file, struct page *page, 124static ssize_t sock_sendpage(struct file *file, struct page *page,
116 int offset, size_t size, loff_t *ppos, int more); 125 int offset, size_t size, loff_t *ppos, int more);
117static ssize_t sock_splice_read(struct file *file, loff_t *ppos, 126static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
118 struct pipe_inode_info *pipe, size_t len, 127 struct pipe_inode_info *pipe, size_t len,
119 unsigned int flags); 128 unsigned int flags);
120 129
121/* 130/*
@@ -147,13 +156,13 @@ static const struct file_operations socket_file_ops = {
147 */ 156 */
148 157
149static DEFINE_SPINLOCK(net_family_lock); 158static DEFINE_SPINLOCK(net_family_lock);
150static const struct net_proto_family *net_families[NPROTO] __read_mostly; 159static const struct net_proto_family __rcu *net_families[NPROTO] __read_mostly;
151 160
152/* 161/*
153 * Statistics counters of the socket lists 162 * Statistics counters of the socket lists
154 */ 163 */
155 164
156static DEFINE_PER_CPU(int, sockets_in_use) = 0; 165static DEFINE_PER_CPU(int, sockets_in_use);
157 166
158/* 167/*
159 * Support routines. 168 * Support routines.
@@ -161,15 +170,6 @@ static DEFINE_PER_CPU(int, sockets_in_use) = 0;
161 * divide and look after the messy bits. 170 * divide and look after the messy bits.
162 */ 171 */
163 172
164#define MAX_SOCK_ADDR 128 /* 108 for Unix domain -
165 16 for IP, 16 for IPX,
166 24 for IPv6,
167 about 80 for AX.25
168 must be at least one bigger than
169 the AF_UNIX size (see net/unix/af_unix.c
170 :unix_mkname()).
171 */
172
173/** 173/**
174 * move_addr_to_kernel - copy a socket address into kernel space 174 * move_addr_to_kernel - copy a socket address into kernel space
175 * @uaddr: Address in user space 175 * @uaddr: Address in user space
@@ -209,8 +209,8 @@ int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr)
209 * specified. Zero is returned for a success. 209 * specified. Zero is returned for a success.
210 */ 210 */
211 211
212int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr, 212static int move_addr_to_user(struct sockaddr *kaddr, int klen,
213 int __user *ulen) 213 void __user *uaddr, int __user *ulen)
214{ 214{
215 int err; 215 int err;
216 int len; 216 int len;
@@ -235,8 +235,6 @@ int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr,
235 return __put_user(klen, ulen); 235 return __put_user(klen, ulen);
236} 236}
237 237
238#define SOCKFS_MAGIC 0x534F434B
239
240static struct kmem_cache *sock_inode_cachep __read_mostly; 238static struct kmem_cache *sock_inode_cachep __read_mostly;
241 239
242static struct inode *sock_alloc_inode(struct super_block *sb) 240static struct inode *sock_alloc_inode(struct super_block *sb)
@@ -246,9 +244,14 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
246 ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL); 244 ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL);
247 if (!ei) 245 if (!ei)
248 return NULL; 246 return NULL;
249 init_waitqueue_head(&ei->socket.wait); 247 ei->socket.wq = kmalloc(sizeof(struct socket_wq), GFP_KERNEL);
248 if (!ei->socket.wq) {
249 kmem_cache_free(sock_inode_cachep, ei);
250 return NULL;
251 }
252 init_waitqueue_head(&ei->socket.wq->wait);
253 ei->socket.wq->fasync_list = NULL;
250 254
251 ei->socket.fasync_list = NULL;
252 ei->socket.state = SS_UNCONNECTED; 255 ei->socket.state = SS_UNCONNECTED;
253 ei->socket.flags = 0; 256 ei->socket.flags = 0;
254 ei->socket.ops = NULL; 257 ei->socket.ops = NULL;
@@ -258,10 +261,22 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
258 return &ei->vfs_inode; 261 return &ei->vfs_inode;
259} 262}
260 263
264
265
266static void wq_free_rcu(struct rcu_head *head)
267{
268 struct socket_wq *wq = container_of(head, struct socket_wq, rcu);
269
270 kfree(wq);
271}
272
261static void sock_destroy_inode(struct inode *inode) 273static void sock_destroy_inode(struct inode *inode)
262{ 274{
263 kmem_cache_free(sock_inode_cachep, 275 struct socket_alloc *ei;
264 container_of(inode, struct socket_alloc, vfs_inode)); 276
277 ei = container_of(inode, struct socket_alloc, vfs_inode);
278 call_rcu(&ei->socket.wq->rcu, wq_free_rcu);
279 kmem_cache_free(sock_inode_cachep, ei);
265} 280}
266 281
267static void init_once(void *foo) 282static void init_once(void *foo)
@@ -285,40 +300,26 @@ static int init_inodecache(void)
285 return 0; 300 return 0;
286} 301}
287 302
288static struct super_operations sockfs_ops = { 303static const struct super_operations sockfs_ops = {
289 .alloc_inode = sock_alloc_inode, 304 .alloc_inode = sock_alloc_inode,
290 .destroy_inode =sock_destroy_inode, 305 .destroy_inode = sock_destroy_inode,
291 .statfs = simple_statfs, 306 .statfs = simple_statfs,
292}; 307};
293 308
294static int sockfs_get_sb(struct file_system_type *fs_type, 309static struct dentry *sockfs_mount(struct file_system_type *fs_type,
295 int flags, const char *dev_name, void *data, 310 int flags, const char *dev_name, void *data)
296 struct vfsmount *mnt)
297{ 311{
298 return get_sb_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC, 312 return mount_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC);
299 mnt);
300} 313}
301 314
302static struct vfsmount *sock_mnt __read_mostly; 315static struct vfsmount *sock_mnt __read_mostly;
303 316
304static struct file_system_type sock_fs_type = { 317static struct file_system_type sock_fs_type = {
305 .name = "sockfs", 318 .name = "sockfs",
306 .get_sb = sockfs_get_sb, 319 .mount = sockfs_mount,
307 .kill_sb = kill_anon_super, 320 .kill_sb = kill_anon_super,
308}; 321};
309 322
310static int sockfs_delete_dentry(struct dentry *dentry)
311{
312 /*
313 * At creation time, we pretended this dentry was hashed
314 * (by clearing DCACHE_UNHASHED bit in d_flags)
315 * At delete time, we restore the truth : not hashed.
316 * (so that dput() can proceed correctly)
317 */
318 dentry->d_flags |= DCACHE_UNHASHED;
319 return 0;
320}
321
322/* 323/*
323 * sockfs_dname() is called from d_path(). 324 * sockfs_dname() is called from d_path().
324 */ 325 */
@@ -329,7 +330,6 @@ static char *sockfs_dname(struct dentry *dentry, char *buffer, int buflen)
329} 330}
330 331
331static const struct dentry_operations sockfs_dentry_operations = { 332static const struct dentry_operations sockfs_dentry_operations = {
332 .d_delete = sockfs_delete_dentry,
333 .d_dname = sockfs_dname, 333 .d_dname = sockfs_dname,
334}; 334};
335 335
@@ -350,70 +350,58 @@ static const struct dentry_operations sockfs_dentry_operations = {
350 * but we take care of internal coherence yet. 350 * but we take care of internal coherence yet.
351 */ 351 */
352 352
353static int sock_alloc_fd(struct file **filep, int flags) 353static int sock_alloc_file(struct socket *sock, struct file **f, int flags)
354{ 354{
355 struct qstr name = { .name = "" };
356 struct path path;
357 struct file *file;
355 int fd; 358 int fd;
356 359
357 fd = get_unused_fd_flags(flags); 360 fd = get_unused_fd_flags(flags);
358 if (likely(fd >= 0)) { 361 if (unlikely(fd < 0))
359 struct file *file = get_empty_filp(); 362 return fd;
360 363
361 *filep = file; 364 path.dentry = d_alloc_pseudo(sock_mnt->mnt_sb, &name);
362 if (unlikely(!file)) { 365 if (unlikely(!path.dentry)) {
363 put_unused_fd(fd); 366 put_unused_fd(fd);
364 return -ENFILE;
365 }
366 } else
367 *filep = NULL;
368 return fd;
369}
370
371static int sock_attach_fd(struct socket *sock, struct file *file, int flags)
372{
373 struct dentry *dentry;
374 struct qstr name = { .name = "" };
375
376 dentry = d_alloc(sock_mnt->mnt_sb->s_root, &name);
377 if (unlikely(!dentry))
378 return -ENOMEM; 367 return -ENOMEM;
368 }
369 path.mnt = mntget(sock_mnt);
379 370
380 dentry->d_op = &sockfs_dentry_operations; 371 d_set_d_op(path.dentry, &sockfs_dentry_operations);
381 /* 372 d_instantiate(path.dentry, SOCK_INODE(sock));
382 * We dont want to push this dentry into global dentry hash table. 373 SOCK_INODE(sock)->i_fop = &socket_file_ops;
383 * We pretend dentry is already hashed, by unsetting DCACHE_UNHASHED
384 * This permits a working /proc/$pid/fd/XXX on sockets
385 */
386 dentry->d_flags &= ~DCACHE_UNHASHED;
387 d_instantiate(dentry, SOCK_INODE(sock));
388 374
389 sock->file = file; 375 file = alloc_file(&path, FMODE_READ | FMODE_WRITE,
390 init_file(file, sock_mnt, dentry, FMODE_READ | FMODE_WRITE,
391 &socket_file_ops); 376 &socket_file_ops);
392 SOCK_INODE(sock)->i_fop = &socket_file_ops; 377 if (unlikely(!file)) {
378 /* drop dentry, keep inode */
379 ihold(path.dentry->d_inode);
380 path_put(&path);
381 put_unused_fd(fd);
382 return -ENFILE;
383 }
384
385 sock->file = file;
393 file->f_flags = O_RDWR | (flags & O_NONBLOCK); 386 file->f_flags = O_RDWR | (flags & O_NONBLOCK);
394 file->f_pos = 0; 387 file->f_pos = 0;
395 file->private_data = sock; 388 file->private_data = sock;
396 389
397 return 0; 390 *f = file;
391 return fd;
398} 392}
399 393
400int sock_map_fd(struct socket *sock, int flags) 394int sock_map_fd(struct socket *sock, int flags)
401{ 395{
402 struct file *newfile; 396 struct file *newfile;
403 int fd = sock_alloc_fd(&newfile, flags); 397 int fd = sock_alloc_file(sock, &newfile, flags);
404
405 if (likely(fd >= 0)) {
406 int err = sock_attach_fd(sock, newfile, flags);
407 398
408 if (unlikely(err < 0)) { 399 if (likely(fd >= 0))
409 put_filp(newfile);
410 put_unused_fd(fd);
411 return err;
412 }
413 fd_install(fd, newfile); 400 fd_install(fd, newfile);
414 } 401
415 return fd; 402 return fd;
416} 403}
404EXPORT_SYMBOL(sock_map_fd);
417 405
418static struct socket *sock_from_file(struct file *file, int *err) 406static struct socket *sock_from_file(struct file *file, int *err)
419{ 407{
@@ -425,7 +413,7 @@ static struct socket *sock_from_file(struct file *file, int *err)
425} 413}
426 414
427/** 415/**
428 * sockfd_lookup - Go from a file number to its socket slot 416 * sockfd_lookup - Go from a file number to its socket slot
429 * @fd: file handle 417 * @fd: file handle
430 * @err: pointer to an error code return 418 * @err: pointer to an error code return
431 * 419 *
@@ -453,6 +441,7 @@ struct socket *sockfd_lookup(int fd, int *err)
453 fput(file); 441 fput(file);
454 return sock; 442 return sock;
455} 443}
444EXPORT_SYMBOL(sockfd_lookup);
456 445
457static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed) 446static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed)
458{ 447{
@@ -489,6 +478,8 @@ static struct socket *sock_alloc(void)
489 478
490 sock = SOCKET_I(inode); 479 sock = SOCKET_I(inode);
491 480
481 kmemcheck_annotate_bitfield(sock, type);
482 inode->i_ino = get_next_ino();
492 inode->i_mode = S_IFSOCK | S_IRWXUGO; 483 inode->i_mode = S_IFSOCK | S_IRWXUGO;
493 inode->i_uid = current_fsuid(); 484 inode->i_uid = current_fsuid();
494 inode->i_gid = current_fsgid(); 485 inode->i_gid = current_fsgid();
@@ -511,6 +502,7 @@ static int sock_no_open(struct inode *irrelevant, struct file *dontcare)
511const struct file_operations bad_sock_fops = { 502const struct file_operations bad_sock_fops = {
512 .owner = THIS_MODULE, 503 .owner = THIS_MODULE,
513 .open = sock_no_open, 504 .open = sock_no_open,
505 .llseek = noop_llseek,
514}; 506};
515 507
516/** 508/**
@@ -532,7 +524,7 @@ void sock_release(struct socket *sock)
532 module_put(owner); 524 module_put(owner);
533 } 525 }
534 526
535 if (sock->fasync_list) 527 if (sock->wq->fasync_list)
536 printk(KERN_ERR "sock_release: fasync list not empty!\n"); 528 printk(KERN_ERR "sock_release: fasync list not empty!\n");
537 529
538 percpu_sub(sockets_in_use, 1); 530 percpu_sub(sockets_in_use, 1);
@@ -542,15 +534,15 @@ void sock_release(struct socket *sock)
542 } 534 }
543 sock->file = NULL; 535 sock->file = NULL;
544} 536}
537EXPORT_SYMBOL(sock_release);
545 538
546int sock_tx_timestamp(struct msghdr *msg, struct sock *sk, 539int sock_tx_timestamp(struct sock *sk, __u8 *tx_flags)
547 union skb_shared_tx *shtx)
548{ 540{
549 shtx->flags = 0; 541 *tx_flags = 0;
550 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE)) 542 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE))
551 shtx->hardware = 1; 543 *tx_flags |= SKBTX_HW_TSTAMP;
552 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE)) 544 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE))
553 shtx->software = 1; 545 *tx_flags |= SKBTX_SW_TSTAMP;
554 return 0; 546 return 0;
555} 547}
556EXPORT_SYMBOL(sock_tx_timestamp); 548EXPORT_SYMBOL(sock_tx_timestamp);
@@ -561,6 +553,8 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock,
561 struct sock_iocb *si = kiocb_to_siocb(iocb); 553 struct sock_iocb *si = kiocb_to_siocb(iocb);
562 int err; 554 int err;
563 555
556 sock_update_classid(sock->sk);
557
564 si->sock = sock; 558 si->sock = sock;
565 si->scm = NULL; 559 si->scm = NULL;
566 si->msg = msg; 560 si->msg = msg;
@@ -586,6 +580,7 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
586 ret = wait_on_sync_kiocb(&iocb); 580 ret = wait_on_sync_kiocb(&iocb);
587 return ret; 581 return ret;
588} 582}
583EXPORT_SYMBOL(sock_sendmsg);
589 584
590int kernel_sendmsg(struct socket *sock, struct msghdr *msg, 585int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
591 struct kvec *vec, size_t num, size_t size) 586 struct kvec *vec, size_t num, size_t size)
@@ -604,6 +599,7 @@ int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
604 set_fs(oldfs); 599 set_fs(oldfs);
605 return result; 600 return result;
606} 601}
602EXPORT_SYMBOL(kernel_sendmsg);
607 603
608static int ktime2ts(ktime_t kt, struct timespec *ts) 604static int ktime2ts(ktime_t kt, struct timespec *ts)
609{ 605{
@@ -639,10 +635,9 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
639 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP, 635 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP,
640 sizeof(tv), &tv); 636 sizeof(tv), &tv);
641 } else { 637 } else {
642 struct timespec ts; 638 skb_get_timestampns(skb, &ts[0]);
643 skb_get_timestampns(skb, &ts);
644 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS, 639 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS,
645 sizeof(ts), &ts); 640 sizeof(ts[0]), &ts[0]);
646 } 641 }
647 } 642 }
648 643
@@ -665,28 +660,48 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
665 put_cmsg(msg, SOL_SOCKET, 660 put_cmsg(msg, SOL_SOCKET,
666 SCM_TIMESTAMPING, sizeof(ts), &ts); 661 SCM_TIMESTAMPING, sizeof(ts), &ts);
667} 662}
668
669EXPORT_SYMBOL_GPL(__sock_recv_timestamp); 663EXPORT_SYMBOL_GPL(__sock_recv_timestamp);
670 664
671static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, 665static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
672 struct msghdr *msg, size_t size, int flags) 666 struct sk_buff *skb)
667{
668 if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && skb->dropcount)
669 put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL,
670 sizeof(__u32), &skb->dropcount);
671}
672
673void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
674 struct sk_buff *skb)
675{
676 sock_recv_timestamp(msg, sk, skb);
677 sock_recv_drops(msg, sk, skb);
678}
679EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
680
681static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock,
682 struct msghdr *msg, size_t size, int flags)
673{ 683{
674 int err;
675 struct sock_iocb *si = kiocb_to_siocb(iocb); 684 struct sock_iocb *si = kiocb_to_siocb(iocb);
676 685
686 sock_update_classid(sock->sk);
687
677 si->sock = sock; 688 si->sock = sock;
678 si->scm = NULL; 689 si->scm = NULL;
679 si->msg = msg; 690 si->msg = msg;
680 si->size = size; 691 si->size = size;
681 si->flags = flags; 692 si->flags = flags;
682 693
683 err = security_socket_recvmsg(sock, msg, size, flags);
684 if (err)
685 return err;
686
687 return sock->ops->recvmsg(iocb, sock, msg, size, flags); 694 return sock->ops->recvmsg(iocb, sock, msg, size, flags);
688} 695}
689 696
697static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock,
698 struct msghdr *msg, size_t size, int flags)
699{
700 int err = security_socket_recvmsg(sock, msg, size, flags);
701
702 return err ?: __sock_recvmsg_nosec(iocb, sock, msg, size, flags);
703}
704
690int sock_recvmsg(struct socket *sock, struct msghdr *msg, 705int sock_recvmsg(struct socket *sock, struct msghdr *msg,
691 size_t size, int flags) 706 size_t size, int flags)
692{ 707{
@@ -701,7 +716,38 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg,
701 ret = wait_on_sync_kiocb(&iocb); 716 ret = wait_on_sync_kiocb(&iocb);
702 return ret; 717 return ret;
703} 718}
719EXPORT_SYMBOL(sock_recvmsg);
720
721static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
722 size_t size, int flags)
723{
724 struct kiocb iocb;
725 struct sock_iocb siocb;
726 int ret;
704 727
728 init_sync_kiocb(&iocb, NULL);
729 iocb.private = &siocb;
730 ret = __sock_recvmsg_nosec(&iocb, sock, msg, size, flags);
731 if (-EIOCBQUEUED == ret)
732 ret = wait_on_sync_kiocb(&iocb);
733 return ret;
734}
735
736/**
737 * kernel_recvmsg - Receive a message from a socket (kernel space)
738 * @sock: The socket to receive the message from
739 * @msg: Received message
740 * @vec: Input s/g array for message data
741 * @num: Size of input s/g array
742 * @size: Number of bytes to read
743 * @flags: Message flags (MSG_DONTWAIT, etc...)
744 *
745 * On return the msg structure contains the scatter/gather array passed in the
746 * vec argument. The array is modified so that it consists of the unfilled
747 * portion of the original array.
748 *
749 * The returned value is the total number of bytes received, or an error.
750 */
705int kernel_recvmsg(struct socket *sock, struct msghdr *msg, 751int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
706 struct kvec *vec, size_t num, size_t size, int flags) 752 struct kvec *vec, size_t num, size_t size, int flags)
707{ 753{
@@ -718,6 +764,7 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
718 set_fs(oldfs); 764 set_fs(oldfs);
719 return result; 765 return result;
720} 766}
767EXPORT_SYMBOL(kernel_recvmsg);
721 768
722static void sock_aio_dtor(struct kiocb *iocb) 769static void sock_aio_dtor(struct kiocb *iocb)
723{ 770{
@@ -736,11 +783,11 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
736 if (more) 783 if (more)
737 flags |= MSG_MORE; 784 flags |= MSG_MORE;
738 785
739 return sock->ops->sendpage(sock, page, offset, size, flags); 786 return kernel_sendpage(sock, page, offset, size, flags);
740} 787}
741 788
742static ssize_t sock_splice_read(struct file *file, loff_t *ppos, 789static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
743 struct pipe_inode_info *pipe, size_t len, 790 struct pipe_inode_info *pipe, size_t len,
744 unsigned int flags) 791 unsigned int flags)
745{ 792{
746 struct socket *sock = file->private_data; 793 struct socket *sock = file->private_data;
@@ -748,6 +795,8 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
748 if (unlikely(!sock->ops->splice_read)) 795 if (unlikely(!sock->ops->splice_read))
749 return -EINVAL; 796 return -EINVAL;
750 797
798 sock_update_classid(sock->sk);
799
751 return sock->ops->splice_read(sock, ppos, pipe, len, flags); 800 return sock->ops->splice_read(sock, ppos, pipe, len, flags);
752} 801}
753 802
@@ -851,7 +900,7 @@ static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov,
851 */ 900 */
852 901
853static DEFINE_MUTEX(br_ioctl_mutex); 902static DEFINE_MUTEX(br_ioctl_mutex);
854static int (*br_ioctl_hook) (struct net *, unsigned int cmd, void __user *arg) = NULL; 903static int (*br_ioctl_hook) (struct net *, unsigned int cmd, void __user *arg);
855 904
856void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *)) 905void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *))
857{ 906{
@@ -859,7 +908,6 @@ void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *))
859 br_ioctl_hook = hook; 908 br_ioctl_hook = hook;
860 mutex_unlock(&br_ioctl_mutex); 909 mutex_unlock(&br_ioctl_mutex);
861} 910}
862
863EXPORT_SYMBOL(brioctl_set); 911EXPORT_SYMBOL(brioctl_set);
864 912
865static DEFINE_MUTEX(vlan_ioctl_mutex); 913static DEFINE_MUTEX(vlan_ioctl_mutex);
@@ -871,7 +919,6 @@ void vlan_ioctl_set(int (*hook) (struct net *, void __user *))
871 vlan_ioctl_hook = hook; 919 vlan_ioctl_hook = hook;
872 mutex_unlock(&vlan_ioctl_mutex); 920 mutex_unlock(&vlan_ioctl_mutex);
873} 921}
874
875EXPORT_SYMBOL(vlan_ioctl_set); 922EXPORT_SYMBOL(vlan_ioctl_set);
876 923
877static DEFINE_MUTEX(dlci_ioctl_mutex); 924static DEFINE_MUTEX(dlci_ioctl_mutex);
@@ -883,9 +930,26 @@ void dlci_ioctl_set(int (*hook) (unsigned int, void __user *))
883 dlci_ioctl_hook = hook; 930 dlci_ioctl_hook = hook;
884 mutex_unlock(&dlci_ioctl_mutex); 931 mutex_unlock(&dlci_ioctl_mutex);
885} 932}
886
887EXPORT_SYMBOL(dlci_ioctl_set); 933EXPORT_SYMBOL(dlci_ioctl_set);
888 934
935static long sock_do_ioctl(struct net *net, struct socket *sock,
936 unsigned int cmd, unsigned long arg)
937{
938 int err;
939 void __user *argp = (void __user *)arg;
940
941 err = sock->ops->ioctl(sock, cmd, arg);
942
943 /*
944 * If this ioctl is unknown try to hand it down
945 * to the NIC driver.
946 */
947 if (err == -ENOIOCTLCMD)
948 err = dev_ioctl(net, cmd, argp);
949
950 return err;
951}
952
889/* 953/*
890 * With an ioctl, arg may well be a user mode pointer, but we don't know 954 * With an ioctl, arg may well be a user mode pointer, but we don't know
891 * what to do with it - that's up to the protocol still. 955 * what to do with it - that's up to the protocol still.
@@ -905,11 +969,11 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
905 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) { 969 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
906 err = dev_ioctl(net, cmd, argp); 970 err = dev_ioctl(net, cmd, argp);
907 } else 971 } else
908#ifdef CONFIG_WIRELESS_EXT 972#ifdef CONFIG_WEXT_CORE
909 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { 973 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
910 err = dev_ioctl(net, cmd, argp); 974 err = dev_ioctl(net, cmd, argp);
911 } else 975 } else
912#endif /* CONFIG_WIRELESS_EXT */ 976#endif
913 switch (cmd) { 977 switch (cmd) {
914 case FIOSETOWN: 978 case FIOSETOWN:
915 case SIOCSPGRP: 979 case SIOCSPGRP:
@@ -959,14 +1023,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
959 mutex_unlock(&dlci_ioctl_mutex); 1023 mutex_unlock(&dlci_ioctl_mutex);
960 break; 1024 break;
961 default: 1025 default:
962 err = sock->ops->ioctl(sock, cmd, arg); 1026 err = sock_do_ioctl(net, sock, cmd, arg);
963
964 /*
965 * If this ioctl is unknown try to hand it down
966 * to the NIC driver.
967 */
968 if (err == -ENOIOCTLCMD)
969 err = dev_ioctl(net, cmd, argp);
970 break; 1027 break;
971 } 1028 }
972 return err; 1029 return err;
@@ -1000,6 +1057,7 @@ out_release:
1000 sock = NULL; 1057 sock = NULL;
1001 goto out; 1058 goto out;
1002} 1059}
1060EXPORT_SYMBOL(sock_create_lite);
1003 1061
1004/* No kernel lock held - perfect */ 1062/* No kernel lock held - perfect */
1005static unsigned int sock_poll(struct file *file, poll_table *wait) 1063static unsigned int sock_poll(struct file *file, poll_table *wait)
@@ -1043,84 +1101,44 @@ static int sock_close(struct inode *inode, struct file *filp)
1043 * 1. fasync_list is modified only under process context socket lock 1101 * 1. fasync_list is modified only under process context socket lock
1044 * i.e. under semaphore. 1102 * i.e. under semaphore.
1045 * 2. fasync_list is used under read_lock(&sk->sk_callback_lock) 1103 * 2. fasync_list is used under read_lock(&sk->sk_callback_lock)
1046 * or under socket lock. 1104 * or under socket lock
1047 * 3. fasync_list can be used from softirq context, so that
1048 * modification under socket lock have to be enhanced with
1049 * write_lock_bh(&sk->sk_callback_lock).
1050 * --ANK (990710)
1051 */ 1105 */
1052 1106
1053static int sock_fasync(int fd, struct file *filp, int on) 1107static int sock_fasync(int fd, struct file *filp, int on)
1054{ 1108{
1055 struct fasync_struct *fa, *fna = NULL, **prev; 1109 struct socket *sock = filp->private_data;
1056 struct socket *sock; 1110 struct sock *sk = sock->sk;
1057 struct sock *sk;
1058
1059 if (on) {
1060 fna = kmalloc(sizeof(struct fasync_struct), GFP_KERNEL);
1061 if (fna == NULL)
1062 return -ENOMEM;
1063 }
1064
1065 sock = filp->private_data;
1066 1111
1067 sk = sock->sk; 1112 if (sk == NULL)
1068 if (sk == NULL) {
1069 kfree(fna);
1070 return -EINVAL; 1113 return -EINVAL;
1071 }
1072 1114
1073 lock_sock(sk); 1115 lock_sock(sk);
1074 1116
1075 spin_lock(&filp->f_lock); 1117 fasync_helper(fd, filp, on, &sock->wq->fasync_list);
1076 if (on)
1077 filp->f_flags |= FASYNC;
1078 else
1079 filp->f_flags &= ~FASYNC;
1080 spin_unlock(&filp->f_lock);
1081
1082 prev = &(sock->fasync_list);
1083 1118
1084 for (fa = *prev; fa != NULL; prev = &fa->fa_next, fa = *prev) 1119 if (!sock->wq->fasync_list)
1085 if (fa->fa_file == filp) 1120 sock_reset_flag(sk, SOCK_FASYNC);
1086 break; 1121 else
1087 1122 sock_set_flag(sk, SOCK_FASYNC);
1088 if (on) {
1089 if (fa != NULL) {
1090 write_lock_bh(&sk->sk_callback_lock);
1091 fa->fa_fd = fd;
1092 write_unlock_bh(&sk->sk_callback_lock);
1093
1094 kfree(fna);
1095 goto out;
1096 }
1097 fna->fa_file = filp;
1098 fna->fa_fd = fd;
1099 fna->magic = FASYNC_MAGIC;
1100 fna->fa_next = sock->fasync_list;
1101 write_lock_bh(&sk->sk_callback_lock);
1102 sock->fasync_list = fna;
1103 write_unlock_bh(&sk->sk_callback_lock);
1104 } else {
1105 if (fa != NULL) {
1106 write_lock_bh(&sk->sk_callback_lock);
1107 *prev = fa->fa_next;
1108 write_unlock_bh(&sk->sk_callback_lock);
1109 kfree(fa);
1110 }
1111 }
1112 1123
1113out: 1124 release_sock(sk);
1114 release_sock(sock->sk);
1115 return 0; 1125 return 0;
1116} 1126}
1117 1127
1118/* This function may be called only under socket lock or callback_lock */ 1128/* This function may be called only under socket lock or callback_lock or rcu_lock */
1119 1129
1120int sock_wake_async(struct socket *sock, int how, int band) 1130int sock_wake_async(struct socket *sock, int how, int band)
1121{ 1131{
1122 if (!sock || !sock->fasync_list) 1132 struct socket_wq *wq;
1133
1134 if (!sock)
1123 return -1; 1135 return -1;
1136 rcu_read_lock();
1137 wq = rcu_dereference(sock->wq);
1138 if (!wq || !wq->fasync_list) {
1139 rcu_read_unlock();
1140 return -1;
1141 }
1124 switch (how) { 1142 switch (how) {
1125 case SOCK_WAKE_WAITD: 1143 case SOCK_WAKE_WAITD:
1126 if (test_bit(SOCK_ASYNC_WAITDATA, &sock->flags)) 1144 if (test_bit(SOCK_ASYNC_WAITDATA, &sock->flags))
@@ -1132,15 +1150,17 @@ int sock_wake_async(struct socket *sock, int how, int band)
1132 /* fall through */ 1150 /* fall through */
1133 case SOCK_WAKE_IO: 1151 case SOCK_WAKE_IO:
1134call_kill: 1152call_kill:
1135 __kill_fasync(sock->fasync_list, SIGIO, band); 1153 kill_fasync(&wq->fasync_list, SIGIO, band);
1136 break; 1154 break;
1137 case SOCK_WAKE_URG: 1155 case SOCK_WAKE_URG:
1138 __kill_fasync(sock->fasync_list, SIGURG, band); 1156 kill_fasync(&wq->fasync_list, SIGURG, band);
1139 } 1157 }
1158 rcu_read_unlock();
1140 return 0; 1159 return 0;
1141} 1160}
1161EXPORT_SYMBOL(sock_wake_async);
1142 1162
1143static int __sock_create(struct net *net, int family, int type, int protocol, 1163int __sock_create(struct net *net, int family, int type, int protocol,
1144 struct socket **res, int kern) 1164 struct socket **res, int kern)
1145{ 1165{
1146 int err; 1166 int err;
@@ -1196,7 +1216,7 @@ static int __sock_create(struct net *net, int family, int type, int protocol,
1196 * requested real, full-featured networking support upon configuration. 1216 * requested real, full-featured networking support upon configuration.
1197 * Otherwise module support will break! 1217 * Otherwise module support will break!
1198 */ 1218 */
1199 if (net_families[family] == NULL) 1219 if (rcu_access_pointer(net_families[family]) == NULL)
1200 request_module("net-pf-%d", family); 1220 request_module("net-pf-%d", family);
1201#endif 1221#endif
1202 1222
@@ -1216,7 +1236,7 @@ static int __sock_create(struct net *net, int family, int type, int protocol,
1216 /* Now protected by module ref count */ 1236 /* Now protected by module ref count */
1217 rcu_read_unlock(); 1237 rcu_read_unlock();
1218 1238
1219 err = pf->create(net, sock, protocol); 1239 err = pf->create(net, sock, protocol, kern);
1220 if (err < 0) 1240 if (err < 0)
1221 goto out_module_put; 1241 goto out_module_put;
1222 1242
@@ -1252,16 +1272,19 @@ out_release:
1252 rcu_read_unlock(); 1272 rcu_read_unlock();
1253 goto out_sock_release; 1273 goto out_sock_release;
1254} 1274}
1275EXPORT_SYMBOL(__sock_create);
1255 1276
1256int sock_create(int family, int type, int protocol, struct socket **res) 1277int sock_create(int family, int type, int protocol, struct socket **res)
1257{ 1278{
1258 return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0); 1279 return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
1259} 1280}
1281EXPORT_SYMBOL(sock_create);
1260 1282
1261int sock_create_kern(int family, int type, int protocol, struct socket **res) 1283int sock_create_kern(int family, int type, int protocol, struct socket **res)
1262{ 1284{
1263 return __sock_create(&init_net, family, type, protocol, res, 1); 1285 return __sock_create(&init_net, family, type, protocol, res, 1);
1264} 1286}
1287EXPORT_SYMBOL(sock_create_kern);
1265 1288
1266SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) 1289SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1267{ 1290{
@@ -1337,29 +1360,19 @@ SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
1337 if (err < 0) 1360 if (err < 0)
1338 goto out_release_both; 1361 goto out_release_both;
1339 1362
1340 fd1 = sock_alloc_fd(&newfile1, flags & O_CLOEXEC); 1363 fd1 = sock_alloc_file(sock1, &newfile1, flags);
1341 if (unlikely(fd1 < 0)) { 1364 if (unlikely(fd1 < 0)) {
1342 err = fd1; 1365 err = fd1;
1343 goto out_release_both; 1366 goto out_release_both;
1344 } 1367 }
1345 1368
1346 fd2 = sock_alloc_fd(&newfile2, flags & O_CLOEXEC); 1369 fd2 = sock_alloc_file(sock2, &newfile2, flags);
1347 if (unlikely(fd2 < 0)) { 1370 if (unlikely(fd2 < 0)) {
1348 err = fd2; 1371 err = fd2;
1349 put_filp(newfile1);
1350 put_unused_fd(fd1);
1351 goto out_release_both;
1352 }
1353
1354 err = sock_attach_fd(sock1, newfile1, flags & O_NONBLOCK);
1355 if (unlikely(err < 0)) {
1356 goto out_fd2;
1357 }
1358
1359 err = sock_attach_fd(sock2, newfile2, flags & O_NONBLOCK);
1360 if (unlikely(err < 0)) {
1361 fput(newfile1); 1372 fput(newfile1);
1362 goto out_fd1; 1373 put_unused_fd(fd1);
1374 sock_release(sock2);
1375 goto out;
1363 } 1376 }
1364 1377
1365 audit_fd_pair(fd1, fd2); 1378 audit_fd_pair(fd1, fd2);
@@ -1385,16 +1398,6 @@ out_release_1:
1385 sock_release(sock1); 1398 sock_release(sock1);
1386out: 1399out:
1387 return err; 1400 return err;
1388
1389out_fd2:
1390 put_filp(newfile1);
1391 sock_release(sock1);
1392out_fd1:
1393 put_filp(newfile2);
1394 sock_release(sock2);
1395 put_unused_fd(fd1);
1396 put_unused_fd(fd2);
1397 goto out;
1398} 1401}
1399 1402
1400/* 1403/*
@@ -1486,7 +1489,8 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
1486 goto out; 1489 goto out;
1487 1490
1488 err = -ENFILE; 1491 err = -ENFILE;
1489 if (!(newsock = sock_alloc())) 1492 newsock = sock_alloc();
1493 if (!newsock)
1490 goto out_put; 1494 goto out_put;
1491 1495
1492 newsock->type = sock->type; 1496 newsock->type = sock->type;
@@ -1498,17 +1502,13 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
1498 */ 1502 */
1499 __module_get(newsock->ops->owner); 1503 __module_get(newsock->ops->owner);
1500 1504
1501 newfd = sock_alloc_fd(&newfile, flags & O_CLOEXEC); 1505 newfd = sock_alloc_file(newsock, &newfile, flags);
1502 if (unlikely(newfd < 0)) { 1506 if (unlikely(newfd < 0)) {
1503 err = newfd; 1507 err = newfd;
1504 sock_release(newsock); 1508 sock_release(newsock);
1505 goto out_put; 1509 goto out_put;
1506 } 1510 }
1507 1511
1508 err = sock_attach_fd(newsock, newfile, flags & O_NONBLOCK);
1509 if (err < 0)
1510 goto out_fd_simple;
1511
1512 err = security_socket_accept(sock, newsock); 1512 err = security_socket_accept(sock, newsock);
1513 if (err) 1513 if (err)
1514 goto out_fd; 1514 goto out_fd;
@@ -1538,11 +1538,6 @@ out_put:
1538 fput_light(sock->file, fput_needed); 1538 fput_light(sock->file, fput_needed);
1539out: 1539out:
1540 return err; 1540 return err;
1541out_fd_simple:
1542 sock_release(newsock);
1543 put_filp(newfile);
1544 put_unused_fd(newfd);
1545 goto out_put;
1546out_fd: 1541out_fd:
1547 fput(newfile); 1542 fput(newfile);
1548 put_unused_fd(newfd); 1543 put_unused_fd(newfd);
@@ -1673,6 +1668,8 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1673 struct iovec iov; 1668 struct iovec iov;
1674 int fput_needed; 1669 int fput_needed;
1675 1670
1671 if (len > INT_MAX)
1672 len = INT_MAX;
1676 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1673 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1677 if (!sock) 1674 if (!sock)
1678 goto out; 1675 goto out;
@@ -1730,6 +1727,8 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
1730 int err, err2; 1727 int err, err2;
1731 int fput_needed; 1728 int fput_needed;
1732 1729
1730 if (size > INT_MAX)
1731 size = INT_MAX;
1733 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1732 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1734 if (!sock) 1733 if (!sock)
1735 goto out; 1734 goto out;
@@ -1882,8 +1881,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
1882 if (MSG_CMSG_COMPAT & flags) { 1881 if (MSG_CMSG_COMPAT & flags) {
1883 if (get_compat_msghdr(&msg_sys, msg_compat)) 1882 if (get_compat_msghdr(&msg_sys, msg_compat))
1884 return -EFAULT; 1883 return -EFAULT;
1885 } 1884 } else if (copy_from_user(&msg_sys, msg, sizeof(struct msghdr)))
1886 else if (copy_from_user(&msg_sys, msg, sizeof(struct msghdr)))
1887 return -EFAULT; 1885 return -EFAULT;
1888 1886
1889 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1887 sock = sockfd_lookup_light(fd, &err, &fput_needed);
@@ -1942,7 +1940,8 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
1942 * Afterwards, it will be a kernel pointer. Thus the compiler-assisted 1940 * Afterwards, it will be a kernel pointer. Thus the compiler-assisted
1943 * checking falls down on this. 1941 * checking falls down on this.
1944 */ 1942 */
1945 if (copy_from_user(ctl_buf, (void __user *)msg_sys.msg_control, 1943 if (copy_from_user(ctl_buf,
1944 (void __user __force *)msg_sys.msg_control,
1946 ctl_len)) 1945 ctl_len))
1947 goto out_freectl; 1946 goto out_freectl;
1948 msg_sys.msg_control = ctl_buf; 1947 msg_sys.msg_control = ctl_buf;
@@ -1965,22 +1964,15 @@ out:
1965 return err; 1964 return err;
1966} 1965}
1967 1966
1968/* 1967static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
1969 * BSD recvmsg interface 1968 struct msghdr *msg_sys, unsigned flags, int nosec)
1970 */
1971
1972SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
1973 unsigned int, flags)
1974{ 1969{
1975 struct compat_msghdr __user *msg_compat = 1970 struct compat_msghdr __user *msg_compat =
1976 (struct compat_msghdr __user *)msg; 1971 (struct compat_msghdr __user *)msg;
1977 struct socket *sock;
1978 struct iovec iovstack[UIO_FASTIOV]; 1972 struct iovec iovstack[UIO_FASTIOV];
1979 struct iovec *iov = iovstack; 1973 struct iovec *iov = iovstack;
1980 struct msghdr msg_sys;
1981 unsigned long cmsg_ptr; 1974 unsigned long cmsg_ptr;
1982 int err, iov_size, total_len, len; 1975 int err, iov_size, total_len, len;
1983 int fput_needed;
1984 1976
1985 /* kernel mode address */ 1977 /* kernel mode address */
1986 struct sockaddr_storage addr; 1978 struct sockaddr_storage addr;
@@ -1990,27 +1982,22 @@ SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
1990 int __user *uaddr_len; 1982 int __user *uaddr_len;
1991 1983
1992 if (MSG_CMSG_COMPAT & flags) { 1984 if (MSG_CMSG_COMPAT & flags) {
1993 if (get_compat_msghdr(&msg_sys, msg_compat)) 1985 if (get_compat_msghdr(msg_sys, msg_compat))
1994 return -EFAULT; 1986 return -EFAULT;
1995 } 1987 } else if (copy_from_user(msg_sys, msg, sizeof(struct msghdr)))
1996 else if (copy_from_user(&msg_sys, msg, sizeof(struct msghdr)))
1997 return -EFAULT; 1988 return -EFAULT;
1998 1989
1999 sock = sockfd_lookup_light(fd, &err, &fput_needed);
2000 if (!sock)
2001 goto out;
2002
2003 err = -EMSGSIZE; 1990 err = -EMSGSIZE;
2004 if (msg_sys.msg_iovlen > UIO_MAXIOV) 1991 if (msg_sys->msg_iovlen > UIO_MAXIOV)
2005 goto out_put; 1992 goto out;
2006 1993
2007 /* Check whether to allocate the iovec area */ 1994 /* Check whether to allocate the iovec area */
2008 err = -ENOMEM; 1995 err = -ENOMEM;
2009 iov_size = msg_sys.msg_iovlen * sizeof(struct iovec); 1996 iov_size = msg_sys->msg_iovlen * sizeof(struct iovec);
2010 if (msg_sys.msg_iovlen > UIO_FASTIOV) { 1997 if (msg_sys->msg_iovlen > UIO_FASTIOV) {
2011 iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL); 1998 iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
2012 if (!iov) 1999 if (!iov)
2013 goto out_put; 2000 goto out;
2014 } 2001 }
2015 2002
2016 /* 2003 /*
@@ -2018,46 +2005,47 @@ SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
2018 * kernel msghdr to use the kernel address space) 2005 * kernel msghdr to use the kernel address space)
2019 */ 2006 */
2020 2007
2021 uaddr = (__force void __user *)msg_sys.msg_name; 2008 uaddr = (__force void __user *)msg_sys->msg_name;
2022 uaddr_len = COMPAT_NAMELEN(msg); 2009 uaddr_len = COMPAT_NAMELEN(msg);
2023 if (MSG_CMSG_COMPAT & flags) { 2010 if (MSG_CMSG_COMPAT & flags) {
2024 err = verify_compat_iovec(&msg_sys, iov, 2011 err = verify_compat_iovec(msg_sys, iov,
2025 (struct sockaddr *)&addr, 2012 (struct sockaddr *)&addr,
2026 VERIFY_WRITE); 2013 VERIFY_WRITE);
2027 } else 2014 } else
2028 err = verify_iovec(&msg_sys, iov, 2015 err = verify_iovec(msg_sys, iov,
2029 (struct sockaddr *)&addr, 2016 (struct sockaddr *)&addr,
2030 VERIFY_WRITE); 2017 VERIFY_WRITE);
2031 if (err < 0) 2018 if (err < 0)
2032 goto out_freeiov; 2019 goto out_freeiov;
2033 total_len = err; 2020 total_len = err;
2034 2021
2035 cmsg_ptr = (unsigned long)msg_sys.msg_control; 2022 cmsg_ptr = (unsigned long)msg_sys->msg_control;
2036 msg_sys.msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT); 2023 msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);
2037 2024
2038 if (sock->file->f_flags & O_NONBLOCK) 2025 if (sock->file->f_flags & O_NONBLOCK)
2039 flags |= MSG_DONTWAIT; 2026 flags |= MSG_DONTWAIT;
2040 err = sock_recvmsg(sock, &msg_sys, total_len, flags); 2027 err = (nosec ? sock_recvmsg_nosec : sock_recvmsg)(sock, msg_sys,
2028 total_len, flags);
2041 if (err < 0) 2029 if (err < 0)
2042 goto out_freeiov; 2030 goto out_freeiov;
2043 len = err; 2031 len = err;
2044 2032
2045 if (uaddr != NULL) { 2033 if (uaddr != NULL) {
2046 err = move_addr_to_user((struct sockaddr *)&addr, 2034 err = move_addr_to_user((struct sockaddr *)&addr,
2047 msg_sys.msg_namelen, uaddr, 2035 msg_sys->msg_namelen, uaddr,
2048 uaddr_len); 2036 uaddr_len);
2049 if (err < 0) 2037 if (err < 0)
2050 goto out_freeiov; 2038 goto out_freeiov;
2051 } 2039 }
2052 err = __put_user((msg_sys.msg_flags & ~MSG_CMSG_COMPAT), 2040 err = __put_user((msg_sys->msg_flags & ~MSG_CMSG_COMPAT),
2053 COMPAT_FLAGS(msg)); 2041 COMPAT_FLAGS(msg));
2054 if (err) 2042 if (err)
2055 goto out_freeiov; 2043 goto out_freeiov;
2056 if (MSG_CMSG_COMPAT & flags) 2044 if (MSG_CMSG_COMPAT & flags)
2057 err = __put_user((unsigned long)msg_sys.msg_control - cmsg_ptr, 2045 err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
2058 &msg_compat->msg_controllen); 2046 &msg_compat->msg_controllen);
2059 else 2047 else
2060 err = __put_user((unsigned long)msg_sys.msg_control - cmsg_ptr, 2048 err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
2061 &msg->msg_controllen); 2049 &msg->msg_controllen);
2062 if (err) 2050 if (err)
2063 goto out_freeiov; 2051 goto out_freeiov;
@@ -2066,21 +2054,166 @@ SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
2066out_freeiov: 2054out_freeiov:
2067 if (iov != iovstack) 2055 if (iov != iovstack)
2068 sock_kfree_s(sock->sk, iov, iov_size); 2056 sock_kfree_s(sock->sk, iov, iov_size);
2069out_put: 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
2070 fput_light(sock->file, fput_needed); 2077 fput_light(sock->file, fput_needed);
2071out: 2078out:
2072 return err; 2079 return err;
2073} 2080}
2074 2081
2075#ifdef __ARCH_WANT_SYS_SOCKETCALL 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;
2092 struct compat_mmsghdr __user *compat_entry;
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;
2112 compat_entry = (struct compat_mmsghdr __user *)mmsg;
2113
2114 while (datagrams < vlen) {
2115 /*
2116 * No need to ask LSM for more than the first datagram.
2117 */
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
2134 if (err)
2135 break;
2136 ++datagrams;
2137
2138 /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */
2139 if (flags & MSG_WAITFORONE)
2140 flags |= MSG_DONTWAIT;
2141
2142 if (timeout) {
2143 ktime_get_ts(timeout);
2144 *timeout = timespec_sub(end_time, *timeout);
2145 if (timeout->tv_sec < 0) {
2146 timeout->tv_sec = timeout->tv_nsec = 0;
2147 break;
2148 }
2149
2150 /* Timeout, return less than vlen datagrams */
2151 if (timeout->tv_nsec == 0 && timeout->tv_sec == 0)
2152 break;
2153 }
2154
2155 /* Out of band data, return right away */
2156 if (msg_sys.msg_flags & MSG_OOB)
2157 break;
2158 }
2159
2160out_put:
2161 fput_light(sock->file, fput_needed);
2162
2163 if (err == 0)
2164 return datagrams;
2165
2166 if (datagrams != 0) {
2167 /*
2168 * We may return less entries than requested (vlen) if the
2169 * sock is non block and there aren't enough datagrams...
2170 */
2171 if (err != -EAGAIN) {
2172 /*
2173 * ... or if recvmsg returns an error after we
2174 * received some datagrams, where we record the
2175 * error to return on the next call or if the
2176 * app asks about it using getsockopt(SO_ERROR).
2177 */
2178 sock->sk->sk_err = -err;
2179 }
2180
2181 return datagrams;
2182 }
2183
2184 return err;
2185}
2186
2187SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
2188 unsigned int, vlen, unsigned int, flags,
2189 struct timespec __user *, timeout)
2190{
2191 int datagrams;
2192 struct timespec timeout_sys;
2193
2194 if (!timeout)
2195 return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL);
2196
2197 if (copy_from_user(&timeout_sys, timeout, sizeof(timeout_sys)))
2198 return -EFAULT;
2199
2200 datagrams = __sys_recvmmsg(fd, mmsg, vlen, flags, &timeout_sys);
2201
2202 if (datagrams > 0 &&
2203 copy_to_user(timeout, &timeout_sys, sizeof(timeout_sys)))
2204 datagrams = -EFAULT;
2205
2206 return datagrams;
2207}
2076 2208
2209#ifdef __ARCH_WANT_SYS_SOCKETCALL
2077/* Argument list sizes for sys_socketcall */ 2210/* Argument list sizes for sys_socketcall */
2078#define AL(x) ((x) * sizeof(unsigned long)) 2211#define AL(x) ((x) * sizeof(unsigned long))
2079static const unsigned char nargs[19]={ 2212static const unsigned char nargs[20] = {
2080 AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), 2213 AL(0), AL(3), AL(3), AL(3), AL(2), AL(3),
2081 AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), 2214 AL(3), AL(3), AL(4), AL(4), AL(4), AL(6),
2082 AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), 2215 AL(6), AL(2), AL(5), AL(5), AL(3), AL(3),
2083 AL(4) 2216 AL(4), AL(5)
2084}; 2217};
2085 2218
2086#undef AL 2219#undef AL
@@ -2098,12 +2231,17 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
2098 unsigned long a[6]; 2231 unsigned long a[6];
2099 unsigned long a0, a1; 2232 unsigned long a0, a1;
2100 int err; 2233 int err;
2234 unsigned int len;
2235
2236 if (call < 1 || call > SYS_RECVMMSG)
2237 return -EINVAL;
2101 2238
2102 if (call < 1 || call > SYS_ACCEPT4) 2239 len = nargs[call];
2240 if (len > sizeof(a))
2103 return -EINVAL; 2241 return -EINVAL;
2104 2242
2105 /* copy_from_user should be SMP safe. */ 2243 /* copy_from_user should be SMP safe. */
2106 if (copy_from_user(a, args, nargs[call])) 2244 if (copy_from_user(a, args, len))
2107 return -EFAULT; 2245 return -EFAULT;
2108 2246
2109 audit_socketcall(nargs[call] / sizeof(unsigned long), a); 2247 audit_socketcall(nargs[call] / sizeof(unsigned long), a);
@@ -2173,6 +2311,10 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
2173 case SYS_RECVMSG: 2311 case SYS_RECVMSG:
2174 err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]); 2312 err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]);
2175 break; 2313 break;
2314 case SYS_RECVMMSG:
2315 err = sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3],
2316 (struct timespec __user *)a[4]);
2317 break;
2176 case SYS_ACCEPT4: 2318 case SYS_ACCEPT4:
2177 err = sys_accept4(a0, (struct sockaddr __user *)a1, 2319 err = sys_accept4(a0, (struct sockaddr __user *)a1,
2178 (int __user *)a[2], a[3]); 2320 (int __user *)a[2], a[3]);
@@ -2206,10 +2348,11 @@ int sock_register(const struct net_proto_family *ops)
2206 } 2348 }
2207 2349
2208 spin_lock(&net_family_lock); 2350 spin_lock(&net_family_lock);
2209 if (net_families[ops->family]) 2351 if (rcu_dereference_protected(net_families[ops->family],
2352 lockdep_is_held(&net_family_lock)))
2210 err = -EEXIST; 2353 err = -EEXIST;
2211 else { 2354 else {
2212 net_families[ops->family] = ops; 2355 rcu_assign_pointer(net_families[ops->family], ops);
2213 err = 0; 2356 err = 0;
2214 } 2357 }
2215 spin_unlock(&net_family_lock); 2358 spin_unlock(&net_family_lock);
@@ -2217,6 +2360,7 @@ int sock_register(const struct net_proto_family *ops)
2217 printk(KERN_INFO "NET: Registered protocol family %d\n", ops->family); 2360 printk(KERN_INFO "NET: Registered protocol family %d\n", ops->family);
2218 return err; 2361 return err;
2219} 2362}
2363EXPORT_SYMBOL(sock_register);
2220 2364
2221/** 2365/**
2222 * sock_unregister - remove a protocol handler 2366 * sock_unregister - remove a protocol handler
@@ -2236,16 +2380,19 @@ void sock_unregister(int family)
2236 BUG_ON(family < 0 || family >= NPROTO); 2380 BUG_ON(family < 0 || family >= NPROTO);
2237 2381
2238 spin_lock(&net_family_lock); 2382 spin_lock(&net_family_lock);
2239 net_families[family] = NULL; 2383 rcu_assign_pointer(net_families[family], NULL);
2240 spin_unlock(&net_family_lock); 2384 spin_unlock(&net_family_lock);
2241 2385
2242 synchronize_rcu(); 2386 synchronize_rcu();
2243 2387
2244 printk(KERN_INFO "NET: Unregistered protocol family %d\n", family); 2388 printk(KERN_INFO "NET: Unregistered protocol family %d\n", family);
2245} 2389}
2390EXPORT_SYMBOL(sock_unregister);
2246 2391
2247static int __init sock_init(void) 2392static int __init sock_init(void)
2248{ 2393{
2394 int err;
2395
2249 /* 2396 /*
2250 * Initialize sock SLAB cache. 2397 * Initialize sock SLAB cache.
2251 */ 2398 */
@@ -2262,8 +2409,15 @@ static int __init sock_init(void)
2262 */ 2409 */
2263 2410
2264 init_inodecache(); 2411 init_inodecache();
2265 register_filesystem(&sock_fs_type); 2412
2413 err = register_filesystem(&sock_fs_type);
2414 if (err)
2415 goto out_fs;
2266 sock_mnt = kern_mount(&sock_fs_type); 2416 sock_mnt = kern_mount(&sock_fs_type);
2417 if (IS_ERR(sock_mnt)) {
2418 err = PTR_ERR(sock_mnt);
2419 goto out_mount;
2420 }
2267 2421
2268 /* The real protocol initialization is performed in later initcalls. 2422 /* The real protocol initialization is performed in later initcalls.
2269 */ 2423 */
@@ -2272,7 +2426,17 @@ static int __init sock_init(void)
2272 netfilter_init(); 2426 netfilter_init();
2273#endif 2427#endif
2274 2428
2275 return 0; 2429#ifdef CONFIG_NETWORK_PHY_TIMESTAMPING
2430 skb_timestamping_init();
2431#endif
2432
2433out:
2434 return err;
2435
2436out_mount:
2437 unregister_filesystem(&sock_fs_type);
2438out_fs:
2439 goto out;
2276} 2440}
2277 2441
2278core_initcall(sock_init); /* early initcall */ 2442core_initcall(sock_init); /* early initcall */
@@ -2295,6 +2459,552 @@ void socket_seq_show(struct seq_file *seq)
2295#endif /* CONFIG_PROC_FS */ 2459#endif /* CONFIG_PROC_FS */
2296 2460
2297#ifdef CONFIG_COMPAT 2461#ifdef CONFIG_COMPAT
2462static int do_siocgstamp(struct net *net, struct socket *sock,
2463 unsigned int cmd, struct compat_timeval __user *up)
2464{
2465 mm_segment_t old_fs = get_fs();
2466 struct timeval ktv;
2467 int err;
2468
2469 set_fs(KERNEL_DS);
2470 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv);
2471 set_fs(old_fs);
2472 if (!err) {
2473 err = put_user(ktv.tv_sec, &up->tv_sec);
2474 err |= __put_user(ktv.tv_usec, &up->tv_usec);
2475 }
2476 return err;
2477}
2478
2479static int do_siocgstampns(struct net *net, struct socket *sock,
2480 unsigned int cmd, struct compat_timespec __user *up)
2481{
2482 mm_segment_t old_fs = get_fs();
2483 struct timespec kts;
2484 int err;
2485
2486 set_fs(KERNEL_DS);
2487 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts);
2488 set_fs(old_fs);
2489 if (!err) {
2490 err = put_user(kts.tv_sec, &up->tv_sec);
2491 err |= __put_user(kts.tv_nsec, &up->tv_nsec);
2492 }
2493 return err;
2494}
2495
2496static int dev_ifname32(struct net *net, struct compat_ifreq __user *uifr32)
2497{
2498 struct ifreq __user *uifr;
2499 int err;
2500
2501 uifr = compat_alloc_user_space(sizeof(struct ifreq));
2502 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq)))
2503 return -EFAULT;
2504
2505 err = dev_ioctl(net, SIOCGIFNAME, uifr);
2506 if (err)
2507 return err;
2508
2509 if (copy_in_user(uifr32, uifr, sizeof(struct compat_ifreq)))
2510 return -EFAULT;
2511
2512 return 0;
2513}
2514
2515static int dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32)
2516{
2517 struct compat_ifconf ifc32;
2518 struct ifconf ifc;
2519 struct ifconf __user *uifc;
2520 struct compat_ifreq __user *ifr32;
2521 struct ifreq __user *ifr;
2522 unsigned int i, j;
2523 int err;
2524
2525 if (copy_from_user(&ifc32, uifc32, sizeof(struct compat_ifconf)))
2526 return -EFAULT;
2527
2528 if (ifc32.ifcbuf == 0) {
2529 ifc32.ifc_len = 0;
2530 ifc.ifc_len = 0;
2531 ifc.ifc_req = NULL;
2532 uifc = compat_alloc_user_space(sizeof(struct ifconf));
2533 } else {
2534 size_t len = ((ifc32.ifc_len / sizeof(struct compat_ifreq)) + 1) *
2535 sizeof(struct ifreq);
2536 uifc = compat_alloc_user_space(sizeof(struct ifconf) + len);
2537 ifc.ifc_len = len;
2538 ifr = ifc.ifc_req = (void __user *)(uifc + 1);
2539 ifr32 = compat_ptr(ifc32.ifcbuf);
2540 for (i = 0; i < ifc32.ifc_len; i += sizeof(struct compat_ifreq)) {
2541 if (copy_in_user(ifr, ifr32, sizeof(struct compat_ifreq)))
2542 return -EFAULT;
2543 ifr++;
2544 ifr32++;
2545 }
2546 }
2547 if (copy_to_user(uifc, &ifc, sizeof(struct ifconf)))
2548 return -EFAULT;
2549
2550 err = dev_ioctl(net, SIOCGIFCONF, uifc);
2551 if (err)
2552 return err;
2553
2554 if (copy_from_user(&ifc, uifc, sizeof(struct ifconf)))
2555 return -EFAULT;
2556
2557 ifr = ifc.ifc_req;
2558 ifr32 = compat_ptr(ifc32.ifcbuf);
2559 for (i = 0, j = 0;
2560 i + sizeof(struct compat_ifreq) <= ifc32.ifc_len && j < ifc.ifc_len;
2561 i += sizeof(struct compat_ifreq), j += sizeof(struct ifreq)) {
2562 if (copy_in_user(ifr32, ifr, sizeof(struct compat_ifreq)))
2563 return -EFAULT;
2564 ifr32++;
2565 ifr++;
2566 }
2567
2568 if (ifc32.ifcbuf == 0) {
2569 /* Translate from 64-bit structure multiple to
2570 * a 32-bit one.
2571 */
2572 i = ifc.ifc_len;
2573 i = ((i / sizeof(struct ifreq)) * sizeof(struct compat_ifreq));
2574 ifc32.ifc_len = i;
2575 } else {
2576 ifc32.ifc_len = i;
2577 }
2578 if (copy_to_user(uifc32, &ifc32, sizeof(struct compat_ifconf)))
2579 return -EFAULT;
2580
2581 return 0;
2582}
2583
2584static int ethtool_ioctl(struct net *net, struct compat_ifreq __user *ifr32)
2585{
2586 struct ifreq __user *ifr;
2587 u32 data;
2588 void __user *datap;
2589
2590 ifr = compat_alloc_user_space(sizeof(*ifr));
2591
2592 if (copy_in_user(&ifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ))
2593 return -EFAULT;
2594
2595 if (get_user(data, &ifr32->ifr_ifru.ifru_data))
2596 return -EFAULT;
2597
2598 datap = compat_ptr(data);
2599 if (put_user(datap, &ifr->ifr_ifru.ifru_data))
2600 return -EFAULT;
2601
2602 return dev_ioctl(net, SIOCETHTOOL, ifr);
2603}
2604
2605static int compat_siocwandev(struct net *net, struct compat_ifreq __user *uifr32)
2606{
2607 void __user *uptr;
2608 compat_uptr_t uptr32;
2609 struct ifreq __user *uifr;
2610
2611 uifr = compat_alloc_user_space(sizeof(*uifr));
2612 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq)))
2613 return -EFAULT;
2614
2615 if (get_user(uptr32, &uifr32->ifr_settings.ifs_ifsu))
2616 return -EFAULT;
2617
2618 uptr = compat_ptr(uptr32);
2619
2620 if (put_user(uptr, &uifr->ifr_settings.ifs_ifsu.raw_hdlc))
2621 return -EFAULT;
2622
2623 return dev_ioctl(net, SIOCWANDEV, uifr);
2624}
2625
2626static int bond_ioctl(struct net *net, unsigned int cmd,
2627 struct compat_ifreq __user *ifr32)
2628{
2629 struct ifreq kifr;
2630 struct ifreq __user *uifr;
2631 mm_segment_t old_fs;
2632 int err;
2633 u32 data;
2634 void __user *datap;
2635
2636 switch (cmd) {
2637 case SIOCBONDENSLAVE:
2638 case SIOCBONDRELEASE:
2639 case SIOCBONDSETHWADDR:
2640 case SIOCBONDCHANGEACTIVE:
2641 if (copy_from_user(&kifr, ifr32, sizeof(struct compat_ifreq)))
2642 return -EFAULT;
2643
2644 old_fs = get_fs();
2645 set_fs(KERNEL_DS);
2646 err = dev_ioctl(net, cmd, &kifr);
2647 set_fs(old_fs);
2648
2649 return err;
2650 case SIOCBONDSLAVEINFOQUERY:
2651 case SIOCBONDINFOQUERY:
2652 uifr = compat_alloc_user_space(sizeof(*uifr));
2653 if (copy_in_user(&uifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ))
2654 return -EFAULT;
2655
2656 if (get_user(data, &ifr32->ifr_ifru.ifru_data))
2657 return -EFAULT;
2658
2659 datap = compat_ptr(data);
2660 if (put_user(datap, &uifr->ifr_ifru.ifru_data))
2661 return -EFAULT;
2662
2663 return dev_ioctl(net, cmd, uifr);
2664 default:
2665 return -EINVAL;
2666 }
2667}
2668
2669static int siocdevprivate_ioctl(struct net *net, unsigned int cmd,
2670 struct compat_ifreq __user *u_ifreq32)
2671{
2672 struct ifreq __user *u_ifreq64;
2673 char tmp_buf[IFNAMSIZ];
2674 void __user *data64;
2675 u32 data32;
2676
2677 if (copy_from_user(&tmp_buf[0], &(u_ifreq32->ifr_ifrn.ifrn_name[0]),
2678 IFNAMSIZ))
2679 return -EFAULT;
2680 if (__get_user(data32, &u_ifreq32->ifr_ifru.ifru_data))
2681 return -EFAULT;
2682 data64 = compat_ptr(data32);
2683
2684 u_ifreq64 = compat_alloc_user_space(sizeof(*u_ifreq64));
2685
2686 /* Don't check these user accesses, just let that get trapped
2687 * in the ioctl handler instead.
2688 */
2689 if (copy_to_user(&u_ifreq64->ifr_ifrn.ifrn_name[0], &tmp_buf[0],
2690 IFNAMSIZ))
2691 return -EFAULT;
2692 if (__put_user(data64, &u_ifreq64->ifr_ifru.ifru_data))
2693 return -EFAULT;
2694
2695 return dev_ioctl(net, cmd, u_ifreq64);
2696}
2697
2698static int dev_ifsioc(struct net *net, struct socket *sock,
2699 unsigned int cmd, struct compat_ifreq __user *uifr32)
2700{
2701 struct ifreq __user *uifr;
2702 int err;
2703
2704 uifr = compat_alloc_user_space(sizeof(*uifr));
2705 if (copy_in_user(uifr, uifr32, sizeof(*uifr32)))
2706 return -EFAULT;
2707
2708 err = sock_do_ioctl(net, sock, cmd, (unsigned long)uifr);
2709
2710 if (!err) {
2711 switch (cmd) {
2712 case SIOCGIFFLAGS:
2713 case SIOCGIFMETRIC:
2714 case SIOCGIFMTU:
2715 case SIOCGIFMEM:
2716 case SIOCGIFHWADDR:
2717 case SIOCGIFINDEX:
2718 case SIOCGIFADDR:
2719 case SIOCGIFBRDADDR:
2720 case SIOCGIFDSTADDR:
2721 case SIOCGIFNETMASK:
2722 case SIOCGIFPFLAGS:
2723 case SIOCGIFTXQLEN:
2724 case SIOCGMIIPHY:
2725 case SIOCGMIIREG:
2726 if (copy_in_user(uifr32, uifr, sizeof(*uifr32)))
2727 err = -EFAULT;
2728 break;
2729 }
2730 }
2731 return err;
2732}
2733
2734static int compat_sioc_ifmap(struct net *net, unsigned int cmd,
2735 struct compat_ifreq __user *uifr32)
2736{
2737 struct ifreq ifr;
2738 struct compat_ifmap __user *uifmap32;
2739 mm_segment_t old_fs;
2740 int err;
2741
2742 uifmap32 = &uifr32->ifr_ifru.ifru_map;
2743 err = copy_from_user(&ifr, uifr32, sizeof(ifr.ifr_name));
2744 err |= __get_user(ifr.ifr_map.mem_start, &uifmap32->mem_start);
2745 err |= __get_user(ifr.ifr_map.mem_end, &uifmap32->mem_end);
2746 err |= __get_user(ifr.ifr_map.base_addr, &uifmap32->base_addr);
2747 err |= __get_user(ifr.ifr_map.irq, &uifmap32->irq);
2748 err |= __get_user(ifr.ifr_map.dma, &uifmap32->dma);
2749 err |= __get_user(ifr.ifr_map.port, &uifmap32->port);
2750 if (err)
2751 return -EFAULT;
2752
2753 old_fs = get_fs();
2754 set_fs(KERNEL_DS);
2755 err = dev_ioctl(net, cmd, (void __user *)&ifr);
2756 set_fs(old_fs);
2757
2758 if (cmd == SIOCGIFMAP && !err) {
2759 err = copy_to_user(uifr32, &ifr, sizeof(ifr.ifr_name));
2760 err |= __put_user(ifr.ifr_map.mem_start, &uifmap32->mem_start);
2761 err |= __put_user(ifr.ifr_map.mem_end, &uifmap32->mem_end);
2762 err |= __put_user(ifr.ifr_map.base_addr, &uifmap32->base_addr);
2763 err |= __put_user(ifr.ifr_map.irq, &uifmap32->irq);
2764 err |= __put_user(ifr.ifr_map.dma, &uifmap32->dma);
2765 err |= __put_user(ifr.ifr_map.port, &uifmap32->port);
2766 if (err)
2767 err = -EFAULT;
2768 }
2769 return err;
2770}
2771
2772static int compat_siocshwtstamp(struct net *net, struct compat_ifreq __user *uifr32)
2773{
2774 void __user *uptr;
2775 compat_uptr_t uptr32;
2776 struct ifreq __user *uifr;
2777
2778 uifr = compat_alloc_user_space(sizeof(*uifr));
2779 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq)))
2780 return -EFAULT;
2781
2782 if (get_user(uptr32, &uifr32->ifr_data))
2783 return -EFAULT;
2784
2785 uptr = compat_ptr(uptr32);
2786
2787 if (put_user(uptr, &uifr->ifr_data))
2788 return -EFAULT;
2789
2790 return dev_ioctl(net, SIOCSHWTSTAMP, uifr);
2791}
2792
2793struct rtentry32 {
2794 u32 rt_pad1;
2795 struct sockaddr rt_dst; /* target address */
2796 struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
2797 struct sockaddr rt_genmask; /* target network mask (IP) */
2798 unsigned short rt_flags;
2799 short rt_pad2;
2800 u32 rt_pad3;
2801 unsigned char rt_tos;
2802 unsigned char rt_class;
2803 short rt_pad4;
2804 short rt_metric; /* +1 for binary compatibility! */
2805 /* char * */ u32 rt_dev; /* forcing the device at add */
2806 u32 rt_mtu; /* per route MTU/Window */
2807 u32 rt_window; /* Window clamping */
2808 unsigned short rt_irtt; /* Initial RTT */
2809};
2810
2811struct in6_rtmsg32 {
2812 struct in6_addr rtmsg_dst;
2813 struct in6_addr rtmsg_src;
2814 struct in6_addr rtmsg_gateway;
2815 u32 rtmsg_type;
2816 u16 rtmsg_dst_len;
2817 u16 rtmsg_src_len;
2818 u32 rtmsg_metric;
2819 u32 rtmsg_info;
2820 u32 rtmsg_flags;
2821 s32 rtmsg_ifindex;
2822};
2823
2824static int routing_ioctl(struct net *net, struct socket *sock,
2825 unsigned int cmd, void __user *argp)
2826{
2827 int ret;
2828 void *r = NULL;
2829 struct in6_rtmsg r6;
2830 struct rtentry r4;
2831 char devname[16];
2832 u32 rtdev;
2833 mm_segment_t old_fs = get_fs();
2834
2835 if (sock && sock->sk && sock->sk->sk_family == AF_INET6) { /* ipv6 */
2836 struct in6_rtmsg32 __user *ur6 = argp;
2837 ret = copy_from_user(&r6.rtmsg_dst, &(ur6->rtmsg_dst),
2838 3 * sizeof(struct in6_addr));
2839 ret |= __get_user(r6.rtmsg_type, &(ur6->rtmsg_type));
2840 ret |= __get_user(r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len));
2841 ret |= __get_user(r6.rtmsg_src_len, &(ur6->rtmsg_src_len));
2842 ret |= __get_user(r6.rtmsg_metric, &(ur6->rtmsg_metric));
2843 ret |= __get_user(r6.rtmsg_info, &(ur6->rtmsg_info));
2844 ret |= __get_user(r6.rtmsg_flags, &(ur6->rtmsg_flags));
2845 ret |= __get_user(r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex));
2846
2847 r = (void *) &r6;
2848 } else { /* ipv4 */
2849 struct rtentry32 __user *ur4 = argp;
2850 ret = copy_from_user(&r4.rt_dst, &(ur4->rt_dst),
2851 3 * sizeof(struct sockaddr));
2852 ret |= __get_user(r4.rt_flags, &(ur4->rt_flags));
2853 ret |= __get_user(r4.rt_metric, &(ur4->rt_metric));
2854 ret |= __get_user(r4.rt_mtu, &(ur4->rt_mtu));
2855 ret |= __get_user(r4.rt_window, &(ur4->rt_window));
2856 ret |= __get_user(r4.rt_irtt, &(ur4->rt_irtt));
2857 ret |= __get_user(rtdev, &(ur4->rt_dev));
2858 if (rtdev) {
2859 ret |= copy_from_user(devname, compat_ptr(rtdev), 15);
2860 r4.rt_dev = devname; devname[15] = 0;
2861 } else
2862 r4.rt_dev = NULL;
2863
2864 r = (void *) &r4;
2865 }
2866
2867 if (ret) {
2868 ret = -EFAULT;
2869 goto out;
2870 }
2871
2872 set_fs(KERNEL_DS);
2873 ret = sock_do_ioctl(net, sock, cmd, (unsigned long) r);
2874 set_fs(old_fs);
2875
2876out:
2877 return ret;
2878}
2879
2880/* Since old style bridge ioctl's endup using SIOCDEVPRIVATE
2881 * for some operations; this forces use of the newer bridge-utils that
2882 * use compatiable ioctls
2883 */
2884static int old_bridge_ioctl(compat_ulong_t __user *argp)
2885{
2886 compat_ulong_t tmp;
2887
2888 if (get_user(tmp, argp))
2889 return -EFAULT;
2890 if (tmp == BRCTL_GET_VERSION)
2891 return BRCTL_VERSION + 1;
2892 return -EINVAL;
2893}
2894
2895static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
2896 unsigned int cmd, unsigned long arg)
2897{
2898 void __user *argp = compat_ptr(arg);
2899 struct sock *sk = sock->sk;
2900 struct net *net = sock_net(sk);
2901
2902 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15))
2903 return siocdevprivate_ioctl(net, cmd, argp);
2904
2905 switch (cmd) {
2906 case SIOCSIFBR:
2907 case SIOCGIFBR:
2908 return old_bridge_ioctl(argp);
2909 case SIOCGIFNAME:
2910 return dev_ifname32(net, argp);
2911 case SIOCGIFCONF:
2912 return dev_ifconf(net, argp);
2913 case SIOCETHTOOL:
2914 return ethtool_ioctl(net, argp);
2915 case SIOCWANDEV:
2916 return compat_siocwandev(net, argp);
2917 case SIOCGIFMAP:
2918 case SIOCSIFMAP:
2919 return compat_sioc_ifmap(net, cmd, argp);
2920 case SIOCBONDENSLAVE:
2921 case SIOCBONDRELEASE:
2922 case SIOCBONDSETHWADDR:
2923 case SIOCBONDSLAVEINFOQUERY:
2924 case SIOCBONDINFOQUERY:
2925 case SIOCBONDCHANGEACTIVE:
2926 return bond_ioctl(net, cmd, argp);
2927 case SIOCADDRT:
2928 case SIOCDELRT:
2929 return routing_ioctl(net, sock, cmd, argp);
2930 case SIOCGSTAMP:
2931 return do_siocgstamp(net, sock, cmd, argp);
2932 case SIOCGSTAMPNS:
2933 return do_siocgstampns(net, sock, cmd, argp);
2934 case SIOCSHWTSTAMP:
2935 return compat_siocshwtstamp(net, argp);
2936
2937 case FIOSETOWN:
2938 case SIOCSPGRP:
2939 case FIOGETOWN:
2940 case SIOCGPGRP:
2941 case SIOCBRADDBR:
2942 case SIOCBRDELBR:
2943 case SIOCGIFVLAN:
2944 case SIOCSIFVLAN:
2945 case SIOCADDDLCI:
2946 case SIOCDELDLCI:
2947 return sock_ioctl(file, cmd, arg);
2948
2949 case SIOCGIFFLAGS:
2950 case SIOCSIFFLAGS:
2951 case SIOCGIFMETRIC:
2952 case SIOCSIFMETRIC:
2953 case SIOCGIFMTU:
2954 case SIOCSIFMTU:
2955 case SIOCGIFMEM:
2956 case SIOCSIFMEM:
2957 case SIOCGIFHWADDR:
2958 case SIOCSIFHWADDR:
2959 case SIOCADDMULTI:
2960 case SIOCDELMULTI:
2961 case SIOCGIFINDEX:
2962 case SIOCGIFADDR:
2963 case SIOCSIFADDR:
2964 case SIOCSIFHWBROADCAST:
2965 case SIOCDIFADDR:
2966 case SIOCGIFBRDADDR:
2967 case SIOCSIFBRDADDR:
2968 case SIOCGIFDSTADDR:
2969 case SIOCSIFDSTADDR:
2970 case SIOCGIFNETMASK:
2971 case SIOCSIFNETMASK:
2972 case SIOCSIFPFLAGS:
2973 case SIOCGIFPFLAGS:
2974 case SIOCGIFTXQLEN:
2975 case SIOCSIFTXQLEN:
2976 case SIOCBRADDIF:
2977 case SIOCBRDELIF:
2978 case SIOCSIFNAME:
2979 case SIOCGMIIPHY:
2980 case SIOCGMIIREG:
2981 case SIOCSMIIREG:
2982 return dev_ifsioc(net, sock, cmd, argp);
2983
2984 case SIOCSARP:
2985 case SIOCGARP:
2986 case SIOCDARP:
2987 case SIOCATMARK:
2988 return sock_do_ioctl(net, sock, cmd, arg);
2989 }
2990
2991 /* Prevent warning from compat_sys_ioctl, these always
2992 * result in -EINVAL in the native case anyway. */
2993 switch (cmd) {
2994 case SIOCRTMSG:
2995 case SIOCGIFCOUNT:
2996 case SIOCSRARP:
2997 case SIOCGRARP:
2998 case SIOCDRARP:
2999 case SIOCSIFLINK:
3000 case SIOCGIFSLAVE:
3001 case SIOCSIFSLAVE:
3002 return -EINVAL;
3003 }
3004
3005 return -ENOIOCTLCMD;
3006}
3007
2298static long compat_sock_ioctl(struct file *file, unsigned cmd, 3008static long compat_sock_ioctl(struct file *file, unsigned cmd,
2299 unsigned long arg) 3009 unsigned long arg)
2300{ 3010{
@@ -2313,6 +3023,9 @@ static long compat_sock_ioctl(struct file *file, unsigned cmd,
2313 (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST)) 3023 (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST))
2314 ret = compat_wext_handle_ioctl(net, cmd, arg); 3024 ret = compat_wext_handle_ioctl(net, cmd, arg);
2315 3025
3026 if (ret == -ENOIOCTLCMD)
3027 ret = compat_sock_ioctl_trans(file, sock, cmd, arg);
3028
2316 return ret; 3029 return ret;
2317} 3030}
2318#endif 3031#endif
@@ -2321,11 +3034,13 @@ int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
2321{ 3034{
2322 return sock->ops->bind(sock, addr, addrlen); 3035 return sock->ops->bind(sock, addr, addrlen);
2323} 3036}
3037EXPORT_SYMBOL(kernel_bind);
2324 3038
2325int kernel_listen(struct socket *sock, int backlog) 3039int kernel_listen(struct socket *sock, int backlog)
2326{ 3040{
2327 return sock->ops->listen(sock, backlog); 3041 return sock->ops->listen(sock, backlog);
2328} 3042}
3043EXPORT_SYMBOL(kernel_listen);
2329 3044
2330int kernel_accept(struct socket *sock, struct socket **newsock, int flags) 3045int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
2331{ 3046{
@@ -2350,65 +3065,82 @@ int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
2350done: 3065done:
2351 return err; 3066 return err;
2352} 3067}
3068EXPORT_SYMBOL(kernel_accept);
2353 3069
2354int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen, 3070int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
2355 int flags) 3071 int flags)
2356{ 3072{
2357 return sock->ops->connect(sock, addr, addrlen, flags); 3073 return sock->ops->connect(sock, addr, addrlen, flags);
2358} 3074}
3075EXPORT_SYMBOL(kernel_connect);
2359 3076
2360int kernel_getsockname(struct socket *sock, struct sockaddr *addr, 3077int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
2361 int *addrlen) 3078 int *addrlen)
2362{ 3079{
2363 return sock->ops->getname(sock, addr, addrlen, 0); 3080 return sock->ops->getname(sock, addr, addrlen, 0);
2364} 3081}
3082EXPORT_SYMBOL(kernel_getsockname);
2365 3083
2366int kernel_getpeername(struct socket *sock, struct sockaddr *addr, 3084int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
2367 int *addrlen) 3085 int *addrlen)
2368{ 3086{
2369 return sock->ops->getname(sock, addr, addrlen, 1); 3087 return sock->ops->getname(sock, addr, addrlen, 1);
2370} 3088}
3089EXPORT_SYMBOL(kernel_getpeername);
2371 3090
2372int kernel_getsockopt(struct socket *sock, int level, int optname, 3091int kernel_getsockopt(struct socket *sock, int level, int optname,
2373 char *optval, int *optlen) 3092 char *optval, int *optlen)
2374{ 3093{
2375 mm_segment_t oldfs = get_fs(); 3094 mm_segment_t oldfs = get_fs();
3095 char __user *uoptval;
3096 int __user *uoptlen;
2376 int err; 3097 int err;
2377 3098
3099 uoptval = (char __user __force *) optval;
3100 uoptlen = (int __user __force *) optlen;
3101
2378 set_fs(KERNEL_DS); 3102 set_fs(KERNEL_DS);
2379 if (level == SOL_SOCKET) 3103 if (level == SOL_SOCKET)
2380 err = sock_getsockopt(sock, level, optname, optval, optlen); 3104 err = sock_getsockopt(sock, level, optname, uoptval, uoptlen);
2381 else 3105 else
2382 err = sock->ops->getsockopt(sock, level, optname, optval, 3106 err = sock->ops->getsockopt(sock, level, optname, uoptval,
2383 optlen); 3107 uoptlen);
2384 set_fs(oldfs); 3108 set_fs(oldfs);
2385 return err; 3109 return err;
2386} 3110}
3111EXPORT_SYMBOL(kernel_getsockopt);
2387 3112
2388int kernel_setsockopt(struct socket *sock, int level, int optname, 3113int kernel_setsockopt(struct socket *sock, int level, int optname,
2389 char *optval, int optlen) 3114 char *optval, unsigned int optlen)
2390{ 3115{
2391 mm_segment_t oldfs = get_fs(); 3116 mm_segment_t oldfs = get_fs();
3117 char __user *uoptval;
2392 int err; 3118 int err;
2393 3119
3120 uoptval = (char __user __force *) optval;
3121
2394 set_fs(KERNEL_DS); 3122 set_fs(KERNEL_DS);
2395 if (level == SOL_SOCKET) 3123 if (level == SOL_SOCKET)
2396 err = sock_setsockopt(sock, level, optname, optval, optlen); 3124 err = sock_setsockopt(sock, level, optname, uoptval, optlen);
2397 else 3125 else
2398 err = sock->ops->setsockopt(sock, level, optname, optval, 3126 err = sock->ops->setsockopt(sock, level, optname, uoptval,
2399 optlen); 3127 optlen);
2400 set_fs(oldfs); 3128 set_fs(oldfs);
2401 return err; 3129 return err;
2402} 3130}
3131EXPORT_SYMBOL(kernel_setsockopt);
2403 3132
2404int kernel_sendpage(struct socket *sock, struct page *page, int offset, 3133int kernel_sendpage(struct socket *sock, struct page *page, int offset,
2405 size_t size, int flags) 3134 size_t size, int flags)
2406{ 3135{
3136 sock_update_classid(sock->sk);
3137
2407 if (sock->ops->sendpage) 3138 if (sock->ops->sendpage)
2408 return sock->ops->sendpage(sock, page, offset, size, flags); 3139 return sock->ops->sendpage(sock, page, offset, size, flags);
2409 3140
2410 return sock_no_sendpage(sock, page, offset, size, flags); 3141 return sock_no_sendpage(sock, page, offset, size, flags);
2411} 3142}
3143EXPORT_SYMBOL(kernel_sendpage);
2412 3144
2413int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg) 3145int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg)
2414{ 3146{
@@ -2421,33 +3153,10 @@ int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg)
2421 3153
2422 return err; 3154 return err;
2423} 3155}
3156EXPORT_SYMBOL(kernel_sock_ioctl);
2424 3157
2425int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how) 3158int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how)
2426{ 3159{
2427 return sock->ops->shutdown(sock, how); 3160 return sock->ops->shutdown(sock, how);
2428} 3161}
2429
2430EXPORT_SYMBOL(sock_create);
2431EXPORT_SYMBOL(sock_create_kern);
2432EXPORT_SYMBOL(sock_create_lite);
2433EXPORT_SYMBOL(sock_map_fd);
2434EXPORT_SYMBOL(sock_recvmsg);
2435EXPORT_SYMBOL(sock_register);
2436EXPORT_SYMBOL(sock_release);
2437EXPORT_SYMBOL(sock_sendmsg);
2438EXPORT_SYMBOL(sock_unregister);
2439EXPORT_SYMBOL(sock_wake_async);
2440EXPORT_SYMBOL(sockfd_lookup);
2441EXPORT_SYMBOL(kernel_sendmsg);
2442EXPORT_SYMBOL(kernel_recvmsg);
2443EXPORT_SYMBOL(kernel_bind);
2444EXPORT_SYMBOL(kernel_listen);
2445EXPORT_SYMBOL(kernel_accept);
2446EXPORT_SYMBOL(kernel_connect);
2447EXPORT_SYMBOL(kernel_getsockname);
2448EXPORT_SYMBOL(kernel_getpeername);
2449EXPORT_SYMBOL(kernel_getsockopt);
2450EXPORT_SYMBOL(kernel_setsockopt);
2451EXPORT_SYMBOL(kernel_sendpage);
2452EXPORT_SYMBOL(kernel_sock_ioctl);
2453EXPORT_SYMBOL(kernel_sock_shutdown); 3162EXPORT_SYMBOL(kernel_sock_shutdown);