diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2018-03-16 12:07:03 -0400 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2018-04-02 14:15:20 -0400 |
commit | 6df354653e8cc07be1f057d9207e1092c0b3963b (patch) | |
tree | 54c13231160e6a6cc6aa461b91d796ce3cff4518 /net/compat.c | |
parent | 157b334aa84dc5a4edcbf056b7254263e4112ba8 (diff) |
net: socket: add __compat_sys_...msg() helpers; remove in-kernel calls to compat syscalls
Using the net-internal helpers __compat_sys_...msg() allows us to avoid
the internal calls to the compat_sys_...msg() syscalls.
compat_sys_recvmmsg() is handled in a different patch.
This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.GA17492@light.dominikbrodowski.net
Cc: David S. Miller <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Diffstat (limited to 'net/compat.c')
-rw-r--r-- | net/compat.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/net/compat.c b/net/compat.c index 7b2ae42a1598..5ae7437d3853 100644 --- a/net/compat.c +++ b/net/compat.c | |||
@@ -747,25 +747,48 @@ static unsigned char nas[21] = { | |||
747 | }; | 747 | }; |
748 | #undef AL | 748 | #undef AL |
749 | 749 | ||
750 | COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags) | 750 | static inline long __compat_sys_sendmsg(int fd, |
751 | struct compat_msghdr __user *msg, | ||
752 | unsigned int flags) | ||
751 | { | 753 | { |
752 | return __sys_sendmsg(fd, (struct user_msghdr __user *)msg, | 754 | return __sys_sendmsg(fd, (struct user_msghdr __user *)msg, |
753 | flags | MSG_CMSG_COMPAT, false); | 755 | flags | MSG_CMSG_COMPAT, false); |
754 | } | 756 | } |
755 | 757 | ||
756 | COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, | 758 | COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, |
757 | unsigned int, vlen, unsigned int, flags) | 759 | unsigned int, flags) |
760 | { | ||
761 | return __compat_sys_sendmsg(fd, msg, flags); | ||
762 | } | ||
763 | |||
764 | static inline long __compat_sys_sendmmsg(int fd, | ||
765 | struct compat_mmsghdr __user *mmsg, | ||
766 | unsigned int vlen, unsigned int flags) | ||
758 | { | 767 | { |
759 | return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, | 768 | return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, |
760 | flags | MSG_CMSG_COMPAT, false); | 769 | flags | MSG_CMSG_COMPAT, false); |
761 | } | 770 | } |
762 | 771 | ||
763 | COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags) | 772 | COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, |
773 | unsigned int, vlen, unsigned int, flags) | ||
774 | { | ||
775 | return __compat_sys_sendmmsg(fd, mmsg, vlen, flags); | ||
776 | } | ||
777 | |||
778 | static inline long __compat_sys_recvmsg(int fd, | ||
779 | struct compat_msghdr __user *msg, | ||
780 | unsigned int flags) | ||
764 | { | 781 | { |
765 | return __sys_recvmsg(fd, (struct user_msghdr __user *)msg, | 782 | return __sys_recvmsg(fd, (struct user_msghdr __user *)msg, |
766 | flags | MSG_CMSG_COMPAT, false); | 783 | flags | MSG_CMSG_COMPAT, false); |
767 | } | 784 | } |
768 | 785 | ||
786 | COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, | ||
787 | unsigned int, flags) | ||
788 | { | ||
789 | return __compat_sys_recvmsg(fd, msg, flags); | ||
790 | } | ||
791 | |||
769 | static inline long __compat_sys_recvfrom(int fd, void __user *buf, | 792 | static inline long __compat_sys_recvfrom(int fd, void __user *buf, |
770 | compat_size_t len, unsigned int flags, | 793 | compat_size_t len, unsigned int flags, |
771 | struct sockaddr __user *addr, | 794 | struct sockaddr __user *addr, |
@@ -893,13 +916,13 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args) | |||
893 | compat_ptr(a[4])); | 916 | compat_ptr(a[4])); |
894 | break; | 917 | break; |
895 | case SYS_SENDMSG: | 918 | case SYS_SENDMSG: |
896 | ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]); | 919 | ret = __compat_sys_sendmsg(a0, compat_ptr(a1), a[2]); |
897 | break; | 920 | break; |
898 | case SYS_SENDMMSG: | 921 | case SYS_SENDMMSG: |
899 | 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]); |
900 | break; | 923 | break; |
901 | case SYS_RECVMSG: | 924 | case SYS_RECVMSG: |
902 | ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); | 925 | ret = __compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); |
903 | break; | 926 | break; |
904 | case SYS_RECVMMSG: | 927 | case SYS_RECVMMSG: |
905 | 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], |