diff options
| author | Mark Brown <[email protected]> | 2013-06-14 10:16:06 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2013-06-14 10:16:06 +0100 | 
| commit | 384b8345589cbbb18a99ce1b112da90c58c802e8 (patch) | |
| tree | 51fee39fa19adad6b24fb90123e7a0ca3159c9c5 /net/socket.c | |
| parent | 9c24b1672283644adf871244771ebf387dd73f90 (diff) | |
| parent | 2e7ee15ced914e109a1a5b6dfcd463d846a13bd5 (diff) | |
Merge branch 'fix/wm8962' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-wm8962
Conflicts:
	sound/soc/codecs/wm8962.c
Diffstat (limited to 'net/socket.c')
| -rw-r--r-- | net/socket.c | 61 | 
1 files changed, 42 insertions, 19 deletions
diff --git a/net/socket.c b/net/socket.c index 6b94633ca61d..4ca1526db756 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1956,7 +1956,7 @@ struct used_address {  	unsigned int name_len;  }; -static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, +static int ___sys_sendmsg(struct socket *sock, struct msghdr __user *msg,  			 struct msghdr *msg_sys, unsigned int flags,  			 struct used_address *used_address)  { @@ -2071,22 +2071,30 @@ out:   *	BSD sendmsg interface   */ -SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags) +long __sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)  {  	int fput_needed, err;  	struct msghdr msg_sys; -	struct socket *sock = sockfd_lookup_light(fd, &err, &fput_needed); +	struct socket *sock; +	sock = sockfd_lookup_light(fd, &err, &fput_needed);  	if (!sock)  		goto out; -	err = __sys_sendmsg(sock, msg, &msg_sys, flags, NULL); +	err = ___sys_sendmsg(sock, msg, &msg_sys, flags, NULL);  	fput_light(sock->file, fput_needed);  out:  	return err;  } +SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags) +{ +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL; +	return __sys_sendmsg(fd, msg, flags); +} +  /*   *	Linux sendmmsg interface   */ @@ -2117,15 +2125,16 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,  	while (datagrams < vlen) {  		if (MSG_CMSG_COMPAT & flags) { -			err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry, -					    &msg_sys, flags, &used_address); +			err = ___sys_sendmsg(sock, (struct msghdr __user *)compat_entry, +					     &msg_sys, flags, &used_address);  			if (err < 0)  				break;  			err = __put_user(err, &compat_entry->msg_len);  			++compat_entry;  		} else { -			err = __sys_sendmsg(sock, (struct msghdr __user *)entry, -					    &msg_sys, flags, &used_address); +			err = ___sys_sendmsg(sock, +					     (struct msghdr __user *)entry, +					     &msg_sys, flags, &used_address);  			if (err < 0)  				break;  			err = put_user(err, &entry->msg_len); @@ -2149,10 +2158,12 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,  SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg,  		unsigned int, vlen, unsigned int, flags)  { +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL;  	return __sys_sendmmsg(fd, mmsg, vlen, flags);  } -static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg, +static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg,  			 struct msghdr *msg_sys, unsigned int flags, int nosec)  {  	struct compat_msghdr __user *msg_compat = @@ -2244,23 +2255,31 @@ out:   *	BSD recvmsg interface   */ -SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg, -		unsigned int, flags) +long __sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags)  {  	int fput_needed, err;  	struct msghdr msg_sys; -	struct socket *sock = sockfd_lookup_light(fd, &err, &fput_needed); +	struct socket *sock; +	sock = sockfd_lookup_light(fd, &err, &fput_needed);  	if (!sock)  		goto out; -	err = __sys_recvmsg(sock, msg, &msg_sys, flags, 0); +	err = ___sys_recvmsg(sock, msg, &msg_sys, flags, 0);  	fput_light(sock->file, fput_needed);  out:  	return err;  } +SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg, +		unsigned int, flags) +{ +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL; +	return __sys_recvmsg(fd, msg, flags); +} +  /*   *     Linux recvmmsg interface   */ @@ -2298,17 +2317,18 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,  		 * No need to ask LSM for more than the first datagram.  		 */  		if (MSG_CMSG_COMPAT & flags) { -			err = __sys_recvmsg(sock, (struct msghdr __user *)compat_entry, -					    &msg_sys, flags & ~MSG_WAITFORONE, -					    datagrams); +			err = ___sys_recvmsg(sock, (struct msghdr __user *)compat_entry, +					     &msg_sys, flags & ~MSG_WAITFORONE, +					     datagrams);  			if (err < 0)  				break;  			err = __put_user(err, &compat_entry->msg_len);  			++compat_entry;  		} else { -			err = __sys_recvmsg(sock, (struct msghdr __user *)entry, -					    &msg_sys, flags & ~MSG_WAITFORONE, -					    datagrams); +			err = ___sys_recvmsg(sock, +					     (struct msghdr __user *)entry, +					     &msg_sys, flags & ~MSG_WAITFORONE, +					     datagrams);  			if (err < 0)  				break;  			err = put_user(err, &entry->msg_len); @@ -2375,6 +2395,9 @@ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,  	int datagrams;  	struct timespec timeout_sys; +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL; +  	if (!timeout)  		return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL);  |