aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-04-03 00:22:12 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-04-03 00:22:12 -0400
commit642e7fd23353e22290e3d51719fcb658dc252342 (patch)
tree93688d5ff15836d8e5b0e097748f7fabb13a303a /net
parent21035965f60b0502fc6537b232839389bb4ce664 (diff)
parentc9a211951c7c79cfb5de888d7d9550872868b086 (diff)
Merge branch 'syscalls-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux
Pull removal of in-kernel calls to syscalls from Dominik Brodowski: "System calls are interaction points between userspace and the kernel. Therefore, system call functions such as sys_xyzzy() or compat_sys_xyzzy() should only be called from userspace via the syscall table, but not from elsewhere in the kernel. At least on 64-bit x86, it will likely be a hard requirement from v4.17 onwards to not call system call functions in the kernel: It is better to use use a different calling convention for system calls there, where struct pt_regs is decoded on-the-fly in a syscall wrapper which then hands processing over to the actual syscall function. This means that only those parameters which are actually needed for a specific syscall are passed on during syscall entry, instead of filling in six CPU registers with random user space content all the time (which may cause serious trouble down the call chain). Those x86-specific patches will be pushed through the x86 tree in the near future. Moreover, rules on how data may be accessed may differ between kernel data and user data. This is another reason why calling sys_xyzzy() is generally a bad idea, and -- at most -- acceptable in arch-specific code. This patchset removes all in-kernel calls to syscall functions in the kernel with the exception of arch/. On top of this, it cleans up the three places where many syscalls are referenced or prototyped, namely kernel/sys_ni.c, include/linux/syscalls.h and include/linux/compat.h" * 'syscalls-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux: (109 commits) bpf: whitelist all syscalls for error injection kernel/sys_ni: remove {sys_,sys_compat} from cond_syscall definitions kernel/sys_ni: sort cond_syscall() entries syscalls/x86: auto-create compat_sys_*() prototypes syscalls: sort syscall prototypes in include/linux/compat.h net: remove compat_sys_*() prototypes from net/compat.h syscalls: sort syscall prototypes in include/linux/syscalls.h kexec: move sys_kexec_load() prototype to syscalls.h x86/sigreturn: use SYSCALL_DEFINE0 x86: fix sys_sigreturn() return type to be long, not unsigned long x86/ioport: add ksys_ioperm() helper; remove in-kernel calls to sys_ioperm() mm: add ksys_readahead() helper; remove in-kernel calls to sys_readahead() mm: add ksys_mmap_pgoff() helper; remove in-kernel calls to sys_mmap_pgoff() mm: add ksys_fadvise64_64() helper; remove in-kernel call to sys_fadvise64_64() fs: add ksys_fallocate() wrapper; remove in-kernel calls to sys_fallocate() fs: add ksys_p{read,write}64() helpers; remove in-kernel calls to syscalls fs: add ksys_truncate() wrapper; remove in-kernel calls to sys_truncate() fs: add ksys_sync_file_range helper(); remove in-kernel calls to syscall kernel: add ksys_setsid() helper; remove in-kernel call to sys_setsid() kernel: add ksys_unshare() helper; remove in-kernel calls to sys_unshare() ...
Diffstat (limited to 'net')
-rw-r--r--net/compat.c136
-rw-r--r--net/socket.c234
2 files changed, 258 insertions, 112 deletions
diff --git a/net/compat.c b/net/compat.c
index 22381719718c..5ae7437d3853 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -383,8 +383,8 @@ static int compat_sock_setsockopt(struct socket *sock, int level, int optname,
383 return sock_setsockopt(sock, level, optname, optval, optlen); 383 return sock_setsockopt(sock, level, optname, optval, optlen);
384} 384}
385 385
386COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname, 386static int __compat_sys_setsockopt(int fd, int level, int optname,
387 char __user *, optval, unsigned int, optlen) 387 char __user *optval, unsigned int optlen)
388{ 388{
389 int err; 389 int err;
390 struct socket *sock = sockfd_lookup(fd, &err); 390 struct socket *sock = sockfd_lookup(fd, &err);
@@ -410,6 +410,12 @@ COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
410 return err; 410 return err;
411} 411}
412 412
413COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
414 char __user *, optval, unsigned int, optlen)
415{
416 return __compat_sys_setsockopt(fd, level, optname, optval, optlen);
417}
418
413static int do_get_sock_timeout(struct socket *sock, int level, int optname, 419static int do_get_sock_timeout(struct socket *sock, int level, int optname,
414 char __user *optval, int __user *optlen) 420 char __user *optval, int __user *optlen)
415{ 421{
@@ -503,8 +509,9 @@ int compat_sock_get_timestampns(struct sock *sk, struct timespec __user *usersta
503} 509}
504EXPORT_SYMBOL(compat_sock_get_timestampns); 510EXPORT_SYMBOL(compat_sock_get_timestampns);
505 511
506COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname, 512static int __compat_sys_getsockopt(int fd, int level, int optname,
507 char __user *, optval, int __user *, optlen) 513 char __user *optval,
514 int __user *optlen)
508{ 515{
509 int err; 516 int err;
510 struct socket *sock = sockfd_lookup(fd, &err); 517 struct socket *sock = sockfd_lookup(fd, &err);
@@ -530,6 +537,12 @@ COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
530 return err; 537 return err;
531} 538}
532 539
540COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
541 char __user *, optval, int __user *, optlen)
542{
543 return __compat_sys_getsockopt(fd, level, optname, optval, optlen);
544}
545
533struct compat_group_req { 546struct compat_group_req {
534 __u32 gr_interface; 547 __u32 gr_interface;
535 struct __kernel_sockaddr_storage gr_group 548 struct __kernel_sockaddr_storage gr_group
@@ -734,38 +747,72 @@ static unsigned char nas[21] = {
734}; 747};
735#undef AL 748#undef AL
736 749
737COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags) 750static inline long __compat_sys_sendmsg(int fd,
751 struct compat_msghdr __user *msg,
752 unsigned int flags)
738{ 753{
739 return __sys_sendmsg(fd, (struct user_msghdr __user *)msg, flags | MSG_CMSG_COMPAT); 754 return __sys_sendmsg(fd, (struct user_msghdr __user *)msg,
755 flags | MSG_CMSG_COMPAT, false);
756}
757
758COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg,
759 unsigned int, flags)
760{
761 return __compat_sys_sendmsg(fd, msg, flags);
762}
763
764static inline long __compat_sys_sendmmsg(int fd,
765 struct compat_mmsghdr __user *mmsg,
766 unsigned int vlen, unsigned int flags)
767{
768 return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
769 flags | MSG_CMSG_COMPAT, false);
740} 770}
741 771
742COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, 772COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
743 unsigned int, vlen, unsigned int, flags) 773 unsigned int, vlen, unsigned int, flags)
744{ 774{
745 return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, 775 return __compat_sys_sendmmsg(fd, mmsg, vlen, flags);
746 flags | MSG_CMSG_COMPAT); 776}
777
778static inline long __compat_sys_recvmsg(int fd,
779 struct compat_msghdr __user *msg,
780 unsigned int flags)
781{
782 return __sys_recvmsg(fd, (struct user_msghdr __user *)msg,
783 flags | MSG_CMSG_COMPAT, false);
784}
785
786COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg,
787 unsigned int, flags)
788{
789 return __compat_sys_recvmsg(fd, msg, flags);
747} 790}
748 791
749COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags) 792static inline long __compat_sys_recvfrom(int fd, void __user *buf,
793 compat_size_t len, unsigned int flags,
794 struct sockaddr __user *addr,
795 int __user *addrlen)
750{ 796{
751 return __sys_recvmsg(fd, (struct user_msghdr __user *)msg, flags | MSG_CMSG_COMPAT); 797 return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr,
798 addrlen);
752} 799}
753 800
754COMPAT_SYSCALL_DEFINE4(recv, int, fd, void __user *, buf, compat_size_t, len, unsigned int, flags) 801COMPAT_SYSCALL_DEFINE4(recv, int, fd, void __user *, buf, compat_size_t, len, unsigned int, flags)
755{ 802{
756 return sys_recv(fd, buf, len, flags | MSG_CMSG_COMPAT); 803 return __compat_sys_recvfrom(fd, buf, len, flags, NULL, NULL);
757} 804}
758 805
759COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, len, 806COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, len,
760 unsigned int, flags, struct sockaddr __user *, addr, 807 unsigned int, flags, struct sockaddr __user *, addr,
761 int __user *, addrlen) 808 int __user *, addrlen)
762{ 809{
763 return sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr, addrlen); 810 return __compat_sys_recvfrom(fd, buf, len, flags, addr, addrlen);
764} 811}
765 812
766COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, 813static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
767 unsigned int, vlen, unsigned int, flags, 814 unsigned int vlen, unsigned int flags,
768 struct compat_timespec __user *, timeout) 815 struct compat_timespec __user *timeout)
769{ 816{
770 int datagrams; 817 int datagrams;
771 struct timespec ktspec; 818 struct timespec ktspec;
@@ -785,6 +832,13 @@ COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
785 return datagrams; 832 return datagrams;
786} 833}
787 834
835COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
836 unsigned int, vlen, unsigned int, flags,
837 struct compat_timespec __user *, timeout)
838{
839 return __compat_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
840}
841
788COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args) 842COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args)
789{ 843{
790 u32 a[AUDITSC_ARGS]; 844 u32 a[AUDITSC_ARGS];
@@ -810,68 +864,72 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args)
810 864
811 switch (call) { 865 switch (call) {
812 case SYS_SOCKET: 866 case SYS_SOCKET:
813 ret = sys_socket(a0, a1, a[2]); 867 ret = __sys_socket(a0, a1, a[2]);
814 break; 868 break;
815 case SYS_BIND: 869 case SYS_BIND:
816 ret = sys_bind(a0, compat_ptr(a1), a[2]); 870 ret = __sys_bind(a0, compat_ptr(a1), a[2]);
817 break; 871 break;
818 case SYS_CONNECT: 872 case SYS_CONNECT:
819 ret = sys_connect(a0, compat_ptr(a1), a[2]); 873 ret = __sys_connect(a0, compat_ptr(a1), a[2]);
820 break; 874 break;
821 case SYS_LISTEN: 875 case SYS_LISTEN:
822 ret = sys_listen(a0, a1); 876 ret = __sys_listen(a0, a1);
823 break; 877 break;
824 case SYS_ACCEPT: 878 case SYS_ACCEPT:
825 ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0); 879 ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
826 break; 880 break;
827 case SYS_GETSOCKNAME: 881 case SYS_GETSOCKNAME:
828 ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2])); 882 ret = __sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
829 break; 883 break;
830 case SYS_GETPEERNAME: 884 case SYS_GETPEERNAME:
831 ret = sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2])); 885 ret = __sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2]));
832 break; 886 break;
833 case SYS_SOCKETPAIR: 887 case SYS_SOCKETPAIR:
834 ret = sys_socketpair(a0, a1, a[2], compat_ptr(a[3])); 888 ret = __sys_socketpair(a0, a1, a[2], compat_ptr(a[3]));
835 break; 889 break;
836 case SYS_SEND: 890 case SYS_SEND:
837 ret = sys_send(a0, compat_ptr(a1), a[2], a[3]); 891 ret = __sys_sendto(a0, compat_ptr(a1), a[2], a[3], NULL, 0);
838 break; 892 break;
839 case SYS_SENDTO: 893 case SYS_SENDTO:
840 ret = sys_sendto(a0, compat_ptr(a1), a[2], a[3], compat_ptr(a[4]), a[5]); 894 ret = __sys_sendto(a0, compat_ptr(a1), a[2], a[3],
895 compat_ptr(a[4]), a[5]);
841 break; 896 break;
842 case SYS_RECV: 897 case SYS_RECV:
843 ret = compat_sys_recv(a0, compat_ptr(a1), a[2], a[3]); 898 ret = __compat_sys_recvfrom(a0, compat_ptr(a1), a[2], a[3],
899 NULL, NULL);
844 break; 900 break;
845 case SYS_RECVFROM: 901 case SYS_RECVFROM:
846 ret = compat_sys_recvfrom(a0, compat_ptr(a1), a[2], a[3], 902 ret = __compat_sys_recvfrom(a0, compat_ptr(a1), a[2], a[3],
847 compat_ptr(a[4]), compat_ptr(a[5])); 903 compat_ptr(a[4]),
904 compat_ptr(a[5]));
848 break; 905 break;
849 case SYS_SHUTDOWN: 906 case SYS_SHUTDOWN:
850 ret = sys_shutdown(a0, a1); 907 ret = __sys_shutdown(a0, a1);
851 break; 908 break;
852 case SYS_SETSOCKOPT: 909 case SYS_SETSOCKOPT:
853 ret = compat_sys_setsockopt(a0, a1, a[2], 910 ret = __compat_sys_setsockopt(a0, a1, a[2],
854 compat_ptr(a[3]), a[4]); 911 compat_ptr(a[3]), a[4]);
855 break; 912 break;
856 case SYS_GETSOCKOPT: 913 case SYS_GETSOCKOPT:
857 ret = compat_sys_getsockopt(a0, a1, a[2], 914 ret = __compat_sys_getsockopt(a0, a1, a[2],
858 compat_ptr(a[3]), compat_ptr(a[4])); 915 compat_ptr(a[3]),
916 compat_ptr(a[4]));
859 break; 917 break;
860 case SYS_SENDMSG: 918 case SYS_SENDMSG:
861 ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]); 919 ret = __compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
862 break; 920 break;
863 case SYS_SENDMMSG: 921 case SYS_SENDMMSG:
864 ret = compat_sys_sendmmsg(a0, compat_ptr(a1), a[2], a[3]); 922 ret = __compat_sys_sendmmsg(a0, compat_ptr(a1), a[2], a[3]);
865 break; 923 break;
866 case SYS_RECVMSG: 924 case SYS_RECVMSG:
867 ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); 925 ret = __compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
868 break; 926 break;
869 case SYS_RECVMMSG: 927 case SYS_RECVMMSG:
870 ret = compat_sys_recvmmsg(a0, compat_ptr(a1), a[2], a[3], 928 ret = __compat_sys_recvmmsg(a0, compat_ptr(a1), a[2], a[3],
871 compat_ptr(a[4])); 929 compat_ptr(a[4]));
872 break; 930 break;
873 case SYS_ACCEPT4: 931 case SYS_ACCEPT4:
874 ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]); 932 ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]);
875 break; 933 break;
876 default: 934 default:
877 ret = -EINVAL; 935 ret = -EINVAL;
diff --git a/net/socket.c b/net/socket.c
index 08847c3b8c39..4ba9fc631c43 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1332,7 +1332,7 @@ int sock_create_kern(struct net *net, int family, int type, int protocol, struct
1332} 1332}
1333EXPORT_SYMBOL(sock_create_kern); 1333EXPORT_SYMBOL(sock_create_kern);
1334 1334
1335SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) 1335int __sys_socket(int family, int type, int protocol)
1336{ 1336{
1337 int retval; 1337 int retval;
1338 struct socket *sock; 1338 struct socket *sock;
@@ -1359,12 +1359,16 @@ SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1359 return sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK)); 1359 return sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
1360} 1360}
1361 1361
1362SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1363{
1364 return __sys_socket(family, type, protocol);
1365}
1366
1362/* 1367/*
1363 * Create a pair of connected sockets. 1368 * Create a pair of connected sockets.
1364 */ 1369 */
1365 1370
1366SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol, 1371int __sys_socketpair(int family, int type, int protocol, int __user *usockvec)
1367 int __user *, usockvec)
1368{ 1372{
1369 struct socket *sock1, *sock2; 1373 struct socket *sock1, *sock2;
1370 int fd1, fd2, err; 1374 int fd1, fd2, err;
@@ -1449,6 +1453,12 @@ out:
1449 return err; 1453 return err;
1450} 1454}
1451 1455
1456SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
1457 int __user *, usockvec)
1458{
1459 return __sys_socketpair(family, type, protocol, usockvec);
1460}
1461
1452/* 1462/*
1453 * Bind a name to a socket. Nothing much to do here since it's 1463 * Bind a name to a socket. Nothing much to do here since it's
1454 * the protocol's responsibility to handle the local address. 1464 * the protocol's responsibility to handle the local address.
@@ -1457,7 +1467,7 @@ out:
1457 * the protocol layer (having also checked the address is ok). 1467 * the protocol layer (having also checked the address is ok).
1458 */ 1468 */
1459 1469
1460SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) 1470int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
1461{ 1471{
1462 struct socket *sock; 1472 struct socket *sock;
1463 struct sockaddr_storage address; 1473 struct sockaddr_storage address;
@@ -1480,13 +1490,18 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
1480 return err; 1490 return err;
1481} 1491}
1482 1492
1493SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
1494{
1495 return __sys_bind(fd, umyaddr, addrlen);
1496}
1497
1483/* 1498/*
1484 * Perform a listen. Basically, we allow the protocol to do anything 1499 * Perform a listen. Basically, we allow the protocol to do anything
1485 * necessary for a listen, and if that works, we mark the socket as 1500 * necessary for a listen, and if that works, we mark the socket as
1486 * ready for listening. 1501 * ready for listening.
1487 */ 1502 */
1488 1503
1489SYSCALL_DEFINE2(listen, int, fd, int, backlog) 1504int __sys_listen(int fd, int backlog)
1490{ 1505{
1491 struct socket *sock; 1506 struct socket *sock;
1492 int err, fput_needed; 1507 int err, fput_needed;
@@ -1507,6 +1522,11 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog)
1507 return err; 1522 return err;
1508} 1523}
1509 1524
1525SYSCALL_DEFINE2(listen, int, fd, int, backlog)
1526{
1527 return __sys_listen(fd, backlog);
1528}
1529
1510/* 1530/*
1511 * For accept, we attempt to create a new socket, set up the link 1531 * For accept, we attempt to create a new socket, set up the link
1512 * with the client, wake up the client, then return the new 1532 * with the client, wake up the client, then return the new
@@ -1519,8 +1539,8 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog)
1519 * clean when we restucture accept also. 1539 * clean when we restucture accept also.
1520 */ 1540 */
1521 1541
1522SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, 1542int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
1523 int __user *, upeer_addrlen, int, flags) 1543 int __user *upeer_addrlen, int flags)
1524{ 1544{
1525 struct socket *sock, *newsock; 1545 struct socket *sock, *newsock;
1526 struct file *newfile; 1546 struct file *newfile;
@@ -1599,10 +1619,16 @@ out_fd:
1599 goto out_put; 1619 goto out_put;
1600} 1620}
1601 1621
1622SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
1623 int __user *, upeer_addrlen, int, flags)
1624{
1625 return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, flags);
1626}
1627
1602SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr, 1628SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr,
1603 int __user *, upeer_addrlen) 1629 int __user *, upeer_addrlen)
1604{ 1630{
1605 return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0); 1631 return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
1606} 1632}
1607 1633
1608/* 1634/*
@@ -1617,8 +1643,7 @@ SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr,
1617 * include the -EINPROGRESS status for such sockets. 1643 * include the -EINPROGRESS status for such sockets.
1618 */ 1644 */
1619 1645
1620SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr, 1646int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
1621 int, addrlen)
1622{ 1647{
1623 struct socket *sock; 1648 struct socket *sock;
1624 struct sockaddr_storage address; 1649 struct sockaddr_storage address;
@@ -1644,13 +1669,19 @@ out:
1644 return err; 1669 return err;
1645} 1670}
1646 1671
1672SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
1673 int, addrlen)
1674{
1675 return __sys_connect(fd, uservaddr, addrlen);
1676}
1677
1647/* 1678/*
1648 * Get the local address ('name') of a socket object. Move the obtained 1679 * Get the local address ('name') of a socket object. Move the obtained
1649 * name to user space. 1680 * name to user space.
1650 */ 1681 */
1651 1682
1652SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr, 1683int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
1653 int __user *, usockaddr_len) 1684 int __user *usockaddr_len)
1654{ 1685{
1655 struct socket *sock; 1686 struct socket *sock;
1656 struct sockaddr_storage address; 1687 struct sockaddr_storage address;
@@ -1675,13 +1706,19 @@ out:
1675 return err; 1706 return err;
1676} 1707}
1677 1708
1709SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
1710 int __user *, usockaddr_len)
1711{
1712 return __sys_getsockname(fd, usockaddr, usockaddr_len);
1713}
1714
1678/* 1715/*
1679 * Get the remote address ('name') of a socket object. Move the obtained 1716 * Get the remote address ('name') of a socket object. Move the obtained
1680 * name to user space. 1717 * name to user space.
1681 */ 1718 */
1682 1719
1683SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr, 1720int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
1684 int __user *, usockaddr_len) 1721 int __user *usockaddr_len)
1685{ 1722{
1686 struct socket *sock; 1723 struct socket *sock;
1687 struct sockaddr_storage address; 1724 struct sockaddr_storage address;
@@ -1706,15 +1743,19 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
1706 return err; 1743 return err;
1707} 1744}
1708 1745
1746SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
1747 int __user *, usockaddr_len)
1748{
1749 return __sys_getpeername(fd, usockaddr, usockaddr_len);
1750}
1751
1709/* 1752/*
1710 * Send a datagram to a given address. We move the address into kernel 1753 * Send a datagram to a given address. We move the address into kernel
1711 * space and check the user space data area is readable before invoking 1754 * space and check the user space data area is readable before invoking
1712 * the protocol. 1755 * the protocol.
1713 */ 1756 */
1714 1757int __sys_sendto(int fd, void __user *buff, size_t len, unsigned int flags,
1715SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len, 1758 struct sockaddr __user *addr, int addr_len)
1716 unsigned int, flags, struct sockaddr __user *, addr,
1717 int, addr_len)
1718{ 1759{
1719 struct socket *sock; 1760 struct socket *sock;
1720 struct sockaddr_storage address; 1761 struct sockaddr_storage address;
@@ -1752,6 +1793,13 @@ out:
1752 return err; 1793 return err;
1753} 1794}
1754 1795
1796SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1797 unsigned int, flags, struct sockaddr __user *, addr,
1798 int, addr_len)
1799{
1800 return __sys_sendto(fd, buff, len, flags, addr, addr_len);
1801}
1802
1755/* 1803/*
1756 * Send a datagram down a socket. 1804 * Send a datagram down a socket.
1757 */ 1805 */
@@ -1759,7 +1807,7 @@ out:
1759SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len, 1807SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
1760 unsigned int, flags) 1808 unsigned int, flags)
1761{ 1809{
1762 return sys_sendto(fd, buff, len, flags, NULL, 0); 1810 return __sys_sendto(fd, buff, len, flags, NULL, 0);
1763} 1811}
1764 1812
1765/* 1813/*
@@ -1767,10 +1815,8 @@ SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
1767 * sender. We verify the buffers are writable and if needed move the 1815 * sender. We verify the buffers are writable and if needed move the
1768 * sender address from kernel to user space. 1816 * sender address from kernel to user space.
1769 */ 1817 */
1770 1818int __sys_recvfrom(int fd, void __user *ubuf, size_t size, unsigned int flags,
1771SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size, 1819 struct sockaddr __user *addr, int __user *addr_len)
1772 unsigned int, flags, struct sockaddr __user *, addr,
1773 int __user *, addr_len)
1774{ 1820{
1775 struct socket *sock; 1821 struct socket *sock;
1776 struct iovec iov; 1822 struct iovec iov;
@@ -1810,6 +1856,13 @@ out:
1810 return err; 1856 return err;
1811} 1857}
1812 1858
1859SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
1860 unsigned int, flags, struct sockaddr __user *, addr,
1861 int __user *, addr_len)
1862{
1863 return __sys_recvfrom(fd, ubuf, size, flags, addr, addr_len);
1864}
1865
1813/* 1866/*
1814 * Receive a datagram from a socket. 1867 * Receive a datagram from a socket.
1815 */ 1868 */
@@ -1817,7 +1870,7 @@ out:
1817SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, size_t, size, 1870SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, size_t, size,
1818 unsigned int, flags) 1871 unsigned int, flags)
1819{ 1872{
1820 return sys_recvfrom(fd, ubuf, size, flags, NULL, NULL); 1873 return __sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
1821} 1874}
1822 1875
1823/* 1876/*
@@ -1825,8 +1878,8 @@ SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, size_t, size,
1825 * to pass the user mode parameter for the protocols to sort out. 1878 * to pass the user mode parameter for the protocols to sort out.
1826 */ 1879 */
1827 1880
1828SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname, 1881static int __sys_setsockopt(int fd, int level, int optname,
1829 char __user *, optval, int, optlen) 1882 char __user *optval, int optlen)
1830{ 1883{
1831 int err, fput_needed; 1884 int err, fput_needed;
1832 struct socket *sock; 1885 struct socket *sock;
@@ -1854,13 +1907,19 @@ out_put:
1854 return err; 1907 return err;
1855} 1908}
1856 1909
1910SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
1911 char __user *, optval, int, optlen)
1912{
1913 return __sys_setsockopt(fd, level, optname, optval, optlen);
1914}
1915
1857/* 1916/*
1858 * Get a socket option. Because we don't know the option lengths we have 1917 * Get a socket option. Because we don't know the option lengths we have
1859 * to pass a user mode parameter for the protocols to sort out. 1918 * to pass a user mode parameter for the protocols to sort out.
1860 */ 1919 */
1861 1920
1862SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname, 1921static int __sys_getsockopt(int fd, int level, int optname,
1863 char __user *, optval, int __user *, optlen) 1922 char __user *optval, int __user *optlen)
1864{ 1923{
1865 int err, fput_needed; 1924 int err, fput_needed;
1866 struct socket *sock; 1925 struct socket *sock;
@@ -1885,11 +1944,17 @@ out_put:
1885 return err; 1944 return err;
1886} 1945}
1887 1946
1947SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
1948 char __user *, optval, int __user *, optlen)
1949{
1950 return __sys_getsockopt(fd, level, optname, optval, optlen);
1951}
1952
1888/* 1953/*
1889 * Shutdown a socket. 1954 * Shutdown a socket.
1890 */ 1955 */
1891 1956
1892SYSCALL_DEFINE2(shutdown, int, fd, int, how) 1957int __sys_shutdown(int fd, int how)
1893{ 1958{
1894 int err, fput_needed; 1959 int err, fput_needed;
1895 struct socket *sock; 1960 struct socket *sock;
@@ -1904,6 +1969,11 @@ SYSCALL_DEFINE2(shutdown, int, fd, int, how)
1904 return err; 1969 return err;
1905} 1970}
1906 1971
1972SYSCALL_DEFINE2(shutdown, int, fd, int, how)
1973{
1974 return __sys_shutdown(fd, how);
1975}
1976
1907/* A couple of helpful macros for getting the address of the 32/64 bit 1977/* A couple of helpful macros for getting the address of the 32/64 bit
1908 * fields which are the same type (int / unsigned) on our platforms. 1978 * fields which are the same type (int / unsigned) on our platforms.
1909 */ 1979 */
@@ -2067,12 +2137,16 @@ out_freeiov:
2067 * BSD sendmsg interface 2137 * BSD sendmsg interface
2068 */ 2138 */
2069 2139
2070long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned flags) 2140long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
2141 bool forbid_cmsg_compat)
2071{ 2142{
2072 int fput_needed, err; 2143 int fput_needed, err;
2073 struct msghdr msg_sys; 2144 struct msghdr msg_sys;
2074 struct socket *sock; 2145 struct socket *sock;
2075 2146
2147 if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
2148 return -EINVAL;
2149
2076 sock = sockfd_lookup_light(fd, &err, &fput_needed); 2150 sock = sockfd_lookup_light(fd, &err, &fput_needed);
2077 if (!sock) 2151 if (!sock)
2078 goto out; 2152 goto out;
@@ -2086,9 +2160,7 @@ out:
2086 2160
2087SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr __user *, msg, unsigned int, flags) 2161SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr __user *, msg, unsigned int, flags)
2088{ 2162{
2089 if (flags & MSG_CMSG_COMPAT) 2163 return __sys_sendmsg(fd, msg, flags, true);
2090 return -EINVAL;
2091 return __sys_sendmsg(fd, msg, flags);
2092} 2164}
2093 2165
2094/* 2166/*
@@ -2096,7 +2168,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr __user *, msg, unsigned int
2096 */ 2168 */
2097 2169
2098int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, 2170int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
2099 unsigned int flags) 2171 unsigned int flags, bool forbid_cmsg_compat)
2100{ 2172{
2101 int fput_needed, err, datagrams; 2173 int fput_needed, err, datagrams;
2102 struct socket *sock; 2174 struct socket *sock;
@@ -2106,6 +2178,9 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
2106 struct used_address used_address; 2178 struct used_address used_address;
2107 unsigned int oflags = flags; 2179 unsigned int oflags = flags;
2108 2180
2181 if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
2182 return -EINVAL;
2183
2109 if (vlen > UIO_MAXIOV) 2184 if (vlen > UIO_MAXIOV)
2110 vlen = UIO_MAXIOV; 2185 vlen = UIO_MAXIOV;
2111 2186
@@ -2162,9 +2237,7 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
2162SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg, 2237SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg,
2163 unsigned int, vlen, unsigned int, flags) 2238 unsigned int, vlen, unsigned int, flags)
2164{ 2239{
2165 if (flags & MSG_CMSG_COMPAT) 2240 return __sys_sendmmsg(fd, mmsg, vlen, flags, true);
2166 return -EINVAL;
2167 return __sys_sendmmsg(fd, mmsg, vlen, flags);
2168} 2241}
2169 2242
2170static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg, 2243static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
@@ -2237,12 +2310,16 @@ out_freeiov:
2237 * BSD recvmsg interface 2310 * BSD recvmsg interface
2238 */ 2311 */
2239 2312
2240long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned flags) 2313long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
2314 bool forbid_cmsg_compat)
2241{ 2315{
2242 int fput_needed, err; 2316 int fput_needed, err;
2243 struct msghdr msg_sys; 2317 struct msghdr msg_sys;
2244 struct socket *sock; 2318 struct socket *sock;
2245 2319
2320 if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
2321 return -EINVAL;
2322
2246 sock = sockfd_lookup_light(fd, &err, &fput_needed); 2323 sock = sockfd_lookup_light(fd, &err, &fput_needed);
2247 if (!sock) 2324 if (!sock)
2248 goto out; 2325 goto out;
@@ -2257,9 +2334,7 @@ out:
2257SYSCALL_DEFINE3(recvmsg, int, fd, struct user_msghdr __user *, msg, 2334SYSCALL_DEFINE3(recvmsg, int, fd, struct user_msghdr __user *, msg,
2258 unsigned int, flags) 2335 unsigned int, flags)
2259{ 2336{
2260 if (flags & MSG_CMSG_COMPAT) 2337 return __sys_recvmsg(fd, msg, flags, true);
2261 return -EINVAL;
2262 return __sys_recvmsg(fd, msg, flags);
2263} 2338}
2264 2339
2265/* 2340/*
@@ -2375,9 +2450,9 @@ out_put:
2375 return datagrams; 2450 return datagrams;
2376} 2451}
2377 2452
2378SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg, 2453static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
2379 unsigned int, vlen, unsigned int, flags, 2454 unsigned int vlen, unsigned int flags,
2380 struct timespec __user *, timeout) 2455 struct timespec __user *timeout)
2381{ 2456{
2382 int datagrams; 2457 int datagrams;
2383 struct timespec timeout_sys; 2458 struct timespec timeout_sys;
@@ -2400,6 +2475,13 @@ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
2400 return datagrams; 2475 return datagrams;
2401} 2476}
2402 2477
2478SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
2479 unsigned int, vlen, unsigned int, flags,
2480 struct timespec __user *, timeout)
2481{
2482 return do_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
2483}
2484
2403#ifdef __ARCH_WANT_SYS_SOCKETCALL 2485#ifdef __ARCH_WANT_SYS_SOCKETCALL
2404/* Argument list sizes for sys_socketcall */ 2486/* Argument list sizes for sys_socketcall */
2405#define AL(x) ((x) * sizeof(unsigned long)) 2487#define AL(x) ((x) * sizeof(unsigned long))
@@ -2447,76 +2529,82 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
2447 2529
2448 switch (call) { 2530 switch (call) {
2449 case SYS_SOCKET: 2531 case SYS_SOCKET:
2450 err = sys_socket(a0, a1, a[2]); 2532 err = __sys_socket(a0, a1, a[2]);
2451 break; 2533 break;
2452 case SYS_BIND: 2534 case SYS_BIND:
2453 err = sys_bind(a0, (struct sockaddr __user *)a1, a[2]); 2535 err = __sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
2454 break; 2536 break;
2455 case SYS_CONNECT: 2537 case SYS_CONNECT:
2456 err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]); 2538 err = __sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
2457 break; 2539 break;
2458 case SYS_LISTEN: 2540 case SYS_LISTEN:
2459 err = sys_listen(a0, a1); 2541 err = __sys_listen(a0, a1);
2460 break; 2542 break;
2461 case SYS_ACCEPT: 2543 case SYS_ACCEPT:
2462 err = sys_accept4(a0, (struct sockaddr __user *)a1, 2544 err = __sys_accept4(a0, (struct sockaddr __user *)a1,
2463 (int __user *)a[2], 0); 2545 (int __user *)a[2], 0);
2464 break; 2546 break;
2465 case SYS_GETSOCKNAME: 2547 case SYS_GETSOCKNAME:
2466 err = 2548 err =
2467 sys_getsockname(a0, (struct sockaddr __user *)a1, 2549 __sys_getsockname(a0, (struct sockaddr __user *)a1,
2468 (int __user *)a[2]); 2550 (int __user *)a[2]);
2469 break; 2551 break;
2470 case SYS_GETPEERNAME: 2552 case SYS_GETPEERNAME:
2471 err = 2553 err =
2472 sys_getpeername(a0, (struct sockaddr __user *)a1, 2554 __sys_getpeername(a0, (struct sockaddr __user *)a1,
2473 (int __user *)a[2]); 2555 (int __user *)a[2]);
2474 break; 2556 break;
2475 case SYS_SOCKETPAIR: 2557 case SYS_SOCKETPAIR:
2476 err = sys_socketpair(a0, a1, a[2], (int __user *)a[3]); 2558 err = __sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
2477 break; 2559 break;
2478 case SYS_SEND: 2560 case SYS_SEND:
2479 err = sys_send(a0, (void __user *)a1, a[2], a[3]); 2561 err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
2562 NULL, 0);
2480 break; 2563 break;
2481 case SYS_SENDTO: 2564 case SYS_SENDTO:
2482 err = sys_sendto(a0, (void __user *)a1, a[2], a[3], 2565 err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
2483 (struct sockaddr __user *)a[4], a[5]); 2566 (struct sockaddr __user *)a[4], a[5]);
2484 break; 2567 break;
2485 case SYS_RECV: 2568 case SYS_RECV:
2486 err = sys_recv(a0, (void __user *)a1, a[2], a[3]); 2569 err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
2570 NULL, NULL);
2487 break; 2571 break;
2488 case SYS_RECVFROM: 2572 case SYS_RECVFROM:
2489 err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3], 2573 err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
2490 (struct sockaddr __user *)a[4], 2574 (struct sockaddr __user *)a[4],
2491 (int __user *)a[5]); 2575 (int __user *)a[5]);
2492 break; 2576 break;
2493 case SYS_SHUTDOWN: 2577 case SYS_SHUTDOWN:
2494 err = sys_shutdown(a0, a1); 2578 err = __sys_shutdown(a0, a1);
2495 break; 2579 break;
2496 case SYS_SETSOCKOPT: 2580 case SYS_SETSOCKOPT:
2497 err = sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]); 2581 err = __sys_setsockopt(a0, a1, a[2], (char __user *)a[3],
2582 a[4]);
2498 break; 2583 break;
2499 case SYS_GETSOCKOPT: 2584 case SYS_GETSOCKOPT:
2500 err = 2585 err =
2501 sys_getsockopt(a0, a1, a[2], (char __user *)a[3], 2586 __sys_getsockopt(a0, a1, a[2], (char __user *)a[3],
2502 (int __user *)a[4]); 2587 (int __user *)a[4]);
2503 break; 2588 break;
2504 case SYS_SENDMSG: 2589 case SYS_SENDMSG:
2505 err = sys_sendmsg(a0, (struct user_msghdr __user *)a1, a[2]); 2590 err = __sys_sendmsg(a0, (struct user_msghdr __user *)a1,
2591 a[2], true);
2506 break; 2592 break;
2507 case SYS_SENDMMSG: 2593 case SYS_SENDMMSG:
2508 err = sys_sendmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3]); 2594 err = __sys_sendmmsg(a0, (struct mmsghdr __user *)a1, a[2],
2595 a[3], true);
2509 break; 2596 break;
2510 case SYS_RECVMSG: 2597 case SYS_RECVMSG:
2511 err = sys_recvmsg(a0, (struct user_msghdr __user *)a1, a[2]); 2598 err = __sys_recvmsg(a0, (struct user_msghdr __user *)a1,
2599 a[2], true);
2512 break; 2600 break;
2513 case SYS_RECVMMSG: 2601 case SYS_RECVMMSG:
2514 err = sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3], 2602 err = do_sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2],
2515 (struct timespec __user *)a[4]); 2603 a[3], (struct timespec __user *)a[4]);
2516 break; 2604 break;
2517 case SYS_ACCEPT4: 2605 case SYS_ACCEPT4:
2518 err = sys_accept4(a0, (struct sockaddr __user *)a1, 2606 err = __sys_accept4(a0, (struct sockaddr __user *)a1,
2519 (int __user *)a[2], a[3]); 2607 (int __user *)a[2], a[3]);
2520 break; 2608 break;
2521 default: 2609 default:
2522 err = -EINVAL; 2610 err = -EINVAL;