diff options
Diffstat (limited to 'net/compat.c')
| -rw-r--r-- | net/compat.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/net/compat.c b/net/compat.c index 3649d5895361..c578d9382e19 100644 --- a/net/compat.c +++ b/net/compat.c | |||
| @@ -722,11 +722,11 @@ EXPORT_SYMBOL(compat_mc_getsockopt); | |||
| 722 | 722 | ||
| 723 | /* Argument list sizes for compat_sys_socketcall */ | 723 | /* Argument list sizes for compat_sys_socketcall */ |
| 724 | #define AL(x) ((x) * sizeof(u32)) | 724 | #define AL(x) ((x) * sizeof(u32)) |
| 725 | static unsigned char nas[20] = { | 725 | static unsigned char nas[21] = { |
| 726 | AL(0), AL(3), AL(3), AL(3), AL(2), AL(3), | 726 | AL(0), AL(3), AL(3), AL(3), AL(2), AL(3), |
| 727 | AL(3), AL(3), AL(4), AL(4), AL(4), AL(6), | 727 | AL(3), AL(3), AL(4), AL(4), AL(4), AL(6), |
| 728 | AL(6), AL(2), AL(5), AL(5), AL(3), AL(3), | 728 | AL(6), AL(2), AL(5), AL(5), AL(3), AL(3), |
| 729 | AL(4), AL(5) | 729 | AL(4), AL(5), AL(4) |
| 730 | }; | 730 | }; |
| 731 | #undef AL | 731 | #undef AL |
| 732 | 732 | ||
| @@ -735,6 +735,13 @@ asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, uns | |||
| 735 | return sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | 735 | return sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); |
| 736 | } | 736 | } |
| 737 | 737 | ||
| 738 | asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg, | ||
| 739 | unsigned vlen, unsigned int flags) | ||
| 740 | { | ||
| 741 | return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, | ||
| 742 | flags | MSG_CMSG_COMPAT); | ||
| 743 | } | ||
| 744 | |||
| 738 | asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags) | 745 | asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags) |
| 739 | { | 746 | { |
| 740 | return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | 747 | return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); |
| @@ -780,7 +787,7 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | |||
| 780 | u32 a[6]; | 787 | u32 a[6]; |
| 781 | u32 a0, a1; | 788 | u32 a0, a1; |
| 782 | 789 | ||
| 783 | if (call < SYS_SOCKET || call > SYS_RECVMMSG) | 790 | if (call < SYS_SOCKET || call > SYS_SENDMMSG) |
| 784 | return -EINVAL; | 791 | return -EINVAL; |
| 785 | if (copy_from_user(a, args, nas[call])) | 792 | if (copy_from_user(a, args, nas[call])) |
| 786 | return -EFAULT; | 793 | return -EFAULT; |
| @@ -839,6 +846,9 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | |||
| 839 | case SYS_SENDMSG: | 846 | case SYS_SENDMSG: |
| 840 | ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]); | 847 | ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]); |
| 841 | break; | 848 | break; |
| 849 | case SYS_SENDMMSG: | ||
| 850 | ret = compat_sys_sendmmsg(a0, compat_ptr(a1), a[2], a[3]); | ||
| 851 | break; | ||
| 842 | case SYS_RECVMSG: | 852 | case SYS_RECVMSG: |
| 843 | ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); | 853 | ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); |
| 844 | break; | 854 | break; |
