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 3649d589536..c578d9382e1 100644 --- a/net/compat.c +++ b/net/compat.c @@ -722,11 +722,11 @@ EXPORT_SYMBOL(compat_mc_getsockopt);  /* Argument list sizes for compat_sys_socketcall */  #define AL(x) ((x) * sizeof(u32)) -static unsigned char nas[20] = { +static unsigned char nas[21] = {  	AL(0), AL(3), AL(3), AL(3), AL(2), AL(3),  	AL(3), AL(3), AL(4), AL(4), AL(4), AL(6),  	AL(6), AL(2), AL(5), AL(5), AL(3), AL(3), -	AL(4), AL(5) +	AL(4), AL(5), AL(4)  };  #undef AL @@ -735,6 +735,13 @@ asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, uns  	return sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);  } +asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg, +				    unsigned vlen, unsigned int flags) +{ +	return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, +			      flags | MSG_CMSG_COMPAT); +} +  asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags)  {  	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)  	u32 a[6];  	u32 a0, a1; -	if (call < SYS_SOCKET || call > SYS_RECVMMSG) +	if (call < SYS_SOCKET || call > SYS_SENDMMSG)  		return -EINVAL;  	if (copy_from_user(a, args, nas[call]))  		return -EFAULT; @@ -839,6 +846,9 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)  	case SYS_SENDMSG:  		ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);  		break; +	case SYS_SENDMMSG: +		ret = compat_sys_sendmmsg(a0, compat_ptr(a1), a[2], a[3]); +		break;  	case SYS_RECVMSG:  		ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);  		break;  |