diff options
Diffstat (limited to 'net/compat.c')
| -rw-r--r-- | net/compat.c | 49 | 
1 files changed, 24 insertions, 25 deletions
diff --git a/net/compat.c b/net/compat.c index f0a1ba6c808..bc8aeefddf3 100644 --- a/net/compat.c +++ b/net/compat.c @@ -71,6 +71,8 @@ int get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr __user *umsg)  	    __get_user(kmsg->msg_controllen, &umsg->msg_controllen) ||  	    __get_user(kmsg->msg_flags, &umsg->msg_flags))  		return -EFAULT; +	if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) +		kmsg->msg_namelen = sizeof(struct sockaddr_storage);  	kmsg->msg_name = compat_ptr(tmp1);  	kmsg->msg_iov = compat_ptr(tmp2);  	kmsg->msg_control = compat_ptr(tmp3); @@ -83,7 +85,7 @@ int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov,  {  	int tot_len; -	if (kern_msg->msg_namelen) { +	if (kern_msg->msg_name && kern_msg->msg_namelen) {  		if (mode == VERIFY_READ) {  			int err = move_addr_to_kernel(kern_msg->msg_name,  						      kern_msg->msg_namelen, @@ -92,8 +94,10 @@ int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov,  				return err;  		}  		kern_msg->msg_name = kern_address; -	} else +	} else {  		kern_msg->msg_name = NULL; +		kern_msg->msg_namelen = 0; +	}  	tot_len = iov_from_user_compat_to_kern(kern_iov,  					  (struct compat_iovec __user *)kern_msg->msg_iov, @@ -381,8 +385,8 @@ static int compat_sock_setsockopt(struct socket *sock, int level, int optname,  	return sock_setsockopt(sock, level, optname, optval, optlen);  } -asmlinkage long compat_sys_setsockopt(int fd, int level, int optname, -				char __user *optval, unsigned int optlen) +COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname, +		       char __user *, optval, unsigned int, optlen)  {  	int err;  	struct socket *sock = sockfd_lookup(fd, &err); @@ -501,8 +505,8 @@ int compat_sock_get_timestampns(struct sock *sk, struct timespec __user *usersta  }  EXPORT_SYMBOL(compat_sock_get_timestampns); -asmlinkage long compat_sys_getsockopt(int fd, int level, int optname, -				char __user *optval, int __user *optlen) +COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname, +		       char __user *, optval, int __user *, optlen)  {  	int err;  	struct socket *sock = sockfd_lookup(fd, &err); @@ -732,15 +736,15 @@ static unsigned char nas[21] = {  };  #undef AL -asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags) +COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags)  {  	if (flags & MSG_CMSG_COMPAT)  		return -EINVAL;  	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 int vlen, unsigned int flags) +COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, +		       unsigned int, vlen, unsigned int, flags)  {  	if (flags & MSG_CMSG_COMPAT)  		return -EINVAL; @@ -748,28 +752,28 @@ asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,  			      flags | MSG_CMSG_COMPAT);  } -asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags) +COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags)  {  	if (flags & MSG_CMSG_COMPAT)  		return -EINVAL;  	return __sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);  } -asmlinkage long compat_sys_recv(int fd, void __user *buf, size_t len, unsigned int flags) +COMPAT_SYSCALL_DEFINE4(recv, int, fd, void __user *, buf, compat_size_t, len, unsigned int, flags)  {  	return sys_recv(fd, buf, len, flags | MSG_CMSG_COMPAT);  } -asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, size_t len, -				    unsigned int flags, struct sockaddr __user *addr, -				    int __user *addrlen) +COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, len, +		       unsigned int, flags, struct sockaddr __user *, addr, +		       int __user *, addrlen)  {  	return sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr, addrlen);  } -asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg, -				    unsigned int vlen, unsigned int flags, -				    struct compat_timespec __user *timeout) +COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, +		       unsigned int, vlen, unsigned int, flags, +		       struct compat_timespec __user *, timeout)  {  	int datagrams;  	struct timespec ktspec; @@ -777,27 +781,22 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,  	if (flags & MSG_CMSG_COMPAT)  		return -EINVAL; -	if (COMPAT_USE_64BIT_TIME) -		return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, -				      flags | MSG_CMSG_COMPAT, -				      (struct timespec *) timeout); -  	if (timeout == NULL)  		return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,  				      flags | MSG_CMSG_COMPAT, NULL); -	if (get_compat_timespec(&ktspec, timeout)) +	if (compat_get_timespec(&ktspec, timeout))  		return -EFAULT;  	datagrams = __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,  				   flags | MSG_CMSG_COMPAT, &ktspec); -	if (datagrams > 0 && put_compat_timespec(&ktspec, timeout)) +	if (datagrams > 0 && compat_put_timespec(&ktspec, timeout))  		datagrams = -EFAULT;  	return datagrams;  } -asmlinkage long compat_sys_socketcall(int call, u32 __user *args) +COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args)  {  	int ret;  	u32 a[6];  | 
