diff options
Diffstat (limited to 'net/core/scm.c')
| -rw-r--r-- | net/core/scm.c | 50 | 
1 files changed, 10 insertions, 40 deletions
diff --git a/net/core/scm.c b/net/core/scm.c index 875df1c2989d..8156d4fb8a39 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -280,36 +280,6 @@ void put_cmsg_scm_timestamping(struct msghdr *msg, struct scm_timestamping_inter  }  EXPORT_SYMBOL(put_cmsg_scm_timestamping); -static int __scm_install_fd(struct file *file, int __user *ufd, int o_flags) -{ -	struct socket *sock; -	int new_fd; -	int error; - -	error = security_file_receive(file); -	if (error) -		return error; - -	new_fd = get_unused_fd_flags(o_flags); -	if (new_fd < 0) -		return new_fd; - -	error = put_user(new_fd, ufd); -	if (error) { -		put_unused_fd(new_fd); -		return error; -	} - -	/* Bump the usage count and install the file. */ -	sock = sock_from_file(file, &error); -	if (sock) { -		sock_update_netprioidx(&sock->sk->sk_cgrp_data); -		sock_update_classid(&sock->sk->sk_cgrp_data); -	} -	fd_install(new_fd, get_file(file)); -	return 0; -} -  static int scm_max_fds(struct msghdr *msg)  {  	if (msg->msg_controllen <= sizeof(struct cmsghdr)) @@ -319,29 +289,29 @@ static int scm_max_fds(struct msghdr *msg)  void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm)  { -	struct cmsghdr __user *cm -		= (__force struct cmsghdr __user*)msg->msg_control; -	int o_flags = (msg->msg_flags & MSG_CMSG_CLOEXEC) ? O_CLOEXEC : 0; +	struct cmsghdr __user *cm = +		(__force struct cmsghdr __user *)msg->msg_control; +	unsigned int o_flags = (msg->msg_flags & MSG_CMSG_CLOEXEC) ? O_CLOEXEC : 0;  	int fdmax = min_t(int, scm_max_fds(msg), scm->fp->count);  	int __user *cmsg_data = CMSG_USER_DATA(cm);  	int err = 0, i; +	/* no use for FD passing from kernel space callers */ +	if (WARN_ON_ONCE(!msg->msg_control_is_user)) +		return; +  	if (msg->msg_flags & MSG_CMSG_COMPAT) {  		scm_detach_fds_compat(msg, scm);  		return;  	} -	/* no use for FD passing from kernel space callers */ -	if (WARN_ON_ONCE(!msg->msg_control_is_user)) -		return; -  	for (i = 0; i < fdmax; i++) { -		err = __scm_install_fd(scm->fp->fp[i], cmsg_data + i, o_flags); -		if (err) +		err = receive_fd_user(scm->fp->fp[i], cmsg_data + i, o_flags); +		if (err < 0)  			break;  	} -	if (i > 0)  { +	if (i > 0) {  		int cmlen = CMSG_LEN(i * sizeof(int));  		err = put_user(SOL_SOCKET, &cm->cmsg_level);  | 
