diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2012-04-12 19:52:19 -0400 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-29 23:28:35 -0400 | 
| commit | f6a5690324d5ab9c33bbc0a6b4cc59c7fa34eeec (patch) | |
| tree | 8ae239168609f06a9bba78058e7f7e3fa18c20d9 | |
| parent | 8515841086d14594b24cdc8febdcc7fd1bbc313e (diff) | |
| download | olio-linux-3.10-f6a5690324d5ab9c33bbc0a6b4cc59c7fa34eeec.tar.xz olio-linux-3.10-f6a5690324d5ab9c33bbc0a6b4cc59c7fa34eeec.zip  | |
ocfs2: deal with __user misannotations
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| -rw-r--r-- | fs/ocfs2/ioctl.c | 31 | ||||
| -rw-r--r-- | fs/ocfs2/move_extents.c | 6 | 
2 files changed, 16 insertions, 21 deletions
diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c index a1a1bfd652c..d96f7f81d8d 100644 --- a/fs/ocfs2/ioctl.c +++ b/fs/ocfs2/ioctl.c @@ -864,7 +864,7 @@ int ocfs2_info_handle(struct inode *inode, struct ocfs2_info *info,  		if (status)  			break; -		reqp = (struct ocfs2_info_request *)(unsigned long)req_addr; +		reqp = (struct ocfs2_info_request __user *)(unsigned long)req_addr;  		if (!reqp) {  			status = -EINVAL;  			goto bail; @@ -888,9 +888,11 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  	struct ocfs2_space_resv sr;  	struct ocfs2_new_group_input input;  	struct reflink_arguments args; -	const char *old_path, *new_path; +	const char __user *old_path; +	const char __user *new_path;  	bool preserve;  	struct ocfs2_info info; +	void __user *argp = (void __user *)arg;  	switch (cmd) {  	case OCFS2_IOC_GETFLAGS: @@ -937,17 +939,15 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  		return ocfs2_group_add(inode, &input);  	case OCFS2_IOC_REFLINK: -		if (copy_from_user(&args, (struct reflink_arguments *)arg, -				   sizeof(args))) +		if (copy_from_user(&args, argp, sizeof(args)))  			return -EFAULT; -		old_path = (const char *)(unsigned long)args.old_path; -		new_path = (const char *)(unsigned long)args.new_path; +		old_path = (const char __user *)(unsigned long)args.old_path; +		new_path = (const char __user *)(unsigned long)args.new_path;  		preserve = (args.preserve != 0);  		return ocfs2_reflink_ioctl(inode, old_path, new_path, preserve);  	case OCFS2_IOC_INFO: -		if (copy_from_user(&info, (struct ocfs2_info __user *)arg, -				   sizeof(struct ocfs2_info))) +		if (copy_from_user(&info, argp, sizeof(struct ocfs2_info)))  			return -EFAULT;  		return ocfs2_info_handle(inode, &info, 0); @@ -960,22 +960,20 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  		if (!capable(CAP_SYS_ADMIN))  			return -EPERM; -		if (copy_from_user(&range, (struct fstrim_range *)arg, -		    sizeof(range))) +		if (copy_from_user(&range, argp, sizeof(range)))  			return -EFAULT;  		ret = ocfs2_trim_fs(sb, &range);  		if (ret < 0)  			return ret; -		if (copy_to_user((struct fstrim_range *)arg, &range, -		    sizeof(range))) +		if (copy_to_user(argp, &range, sizeof(range)))  			return -EFAULT;  		return 0;  	}  	case OCFS2_IOC_MOVE_EXT: -		return ocfs2_ioctl_move_extents(filp, (void __user *)arg); +		return ocfs2_ioctl_move_extents(filp, argp);  	default:  		return -ENOTTY;  	} @@ -988,6 +986,7 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)  	struct reflink_arguments args;  	struct inode *inode = file->f_path.dentry->d_inode;  	struct ocfs2_info info; +	void __user *argp = (void __user *)arg;  	switch (cmd) {  	case OCFS2_IOC32_GETFLAGS: @@ -1006,16 +1005,14 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)  	case FITRIM:  		break;  	case OCFS2_IOC_REFLINK: -		if (copy_from_user(&args, (struct reflink_arguments *)arg, -				   sizeof(args))) +		if (copy_from_user(&args, argp, sizeof(args)))  			return -EFAULT;  		preserve = (args.preserve != 0);  		return ocfs2_reflink_ioctl(inode, compat_ptr(args.old_path),  					   compat_ptr(args.new_path), preserve);  	case OCFS2_IOC_INFO: -		if (copy_from_user(&info, (struct ocfs2_info __user *)arg, -				   sizeof(struct ocfs2_info))) +		if (copy_from_user(&info, argp, sizeof(struct ocfs2_info)))  			return -EFAULT;  		return ocfs2_info_handle(inode, &info, 1); diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c index b1e3fce72ea..6083432f667 100644 --- a/fs/ocfs2/move_extents.c +++ b/fs/ocfs2/move_extents.c @@ -1082,8 +1082,7 @@ int ocfs2_ioctl_move_extents(struct file *filp, void __user *argp)  	context->file = filp;  	if (argp) { -		if (copy_from_user(&range, (struct ocfs2_move_extents *)argp, -				   sizeof(range))) { +		if (copy_from_user(&range, argp, sizeof(range))) {  			status = -EFAULT;  			goto out;  		} @@ -1138,8 +1137,7 @@ out:  	 * length and new_offset even if failure happens somewhere.  	 */  	if (argp) { -		if (copy_to_user((struct ocfs2_move_extents *)argp, &range, -				sizeof(range))) +		if (copy_to_user(argp, &range, sizeof(range)))  			status = -EFAULT;  	}  |