Re: [PATCH 1/3] bcachefs: chardev: return -EFAULT if copy_to_user() fails

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 14, 2023 at 05:58:07PM +0300, Dan Carpenter wrote:
> The copy_to_user() function returns the number of bytes remaining but
> we want to return -EFAULT to the user.
> 
> Fixes: e0750d947352 ("bcachefs: Initial commit")
> Signed-off-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>

Thanks - never liked this about copy_to_user(), that behaviour is
practically never what we want, maybe we could get a helper that returns
the proper error code someday...

> ---
>  fs/bcachefs/chardev.c | 30 ++++++++++++++++++++----------
>  1 file changed, 20 insertions(+), 10 deletions(-)
> 
> diff --git a/fs/bcachefs/chardev.c b/fs/bcachefs/chardev.c
> index fb603df099a5..e5e9fddddfb5 100644
> --- a/fs/bcachefs/chardev.c
> +++ b/fs/bcachefs/chardev.c
> @@ -149,9 +149,10 @@ static long bch2_global_ioctl(unsigned cmd, void __user *arg)
>  static long bch2_ioctl_query_uuid(struct bch_fs *c,
>  			struct bch_ioctl_query_uuid __user *user_arg)
>  {
> -	return copy_to_user(&user_arg->uuid,
> -			    &c->sb.user_uuid,
> -			    sizeof(c->sb.user_uuid));
> +	if (copy_to_user(&user_arg->uuid, &c->sb.user_uuid,
> +			 sizeof(c->sb.user_uuid)))
> +		return -EFAULT;
> +	return 0;
>  }
>  
>  #if 0
> @@ -338,7 +339,10 @@ static ssize_t bch2_data_job_read(struct file *file, char __user *buf,
>  	if (len < sizeof(e))
>  		return -EINVAL;
>  
> -	return copy_to_user(buf, &e, sizeof(e)) ?: sizeof(e);
> +	if (copy_to_user(buf, &e, sizeof(e)))
> +		return -EFAULT;
> +
> +	return sizeof(e);
>  }
>  
>  static const struct file_operations bcachefs_data_ops = {
> @@ -466,9 +470,11 @@ static long bch2_ioctl_fs_usage(struct bch_fs *c,
>  	percpu_up_read(&c->mark_lock);
>  	kfree(src);
>  
> -	if (!ret)
> -		ret = copy_to_user(user_arg, arg,
> -			sizeof(*arg) + arg->replica_entries_bytes);
> +	if (ret)
> +		goto err;
> +	if (copy_to_user(user_arg, arg,
> +			 sizeof(*arg) + arg->replica_entries_bytes))
> +		ret = -EFAULT;
>  err:
>  	kfree(arg);
>  	return ret;
> @@ -513,7 +519,10 @@ static long bch2_ioctl_dev_usage(struct bch_fs *c,
>  
>  	percpu_ref_put(&ca->ref);
>  
> -	return copy_to_user(user_arg, &arg, sizeof(arg));
> +	if (copy_to_user(user_arg, &arg, sizeof(arg)))
> +		return -EFAULT;
> +
> +	return 0;
>  }
>  
>  static long bch2_ioctl_read_super(struct bch_fs *c,
> @@ -550,8 +559,9 @@ static long bch2_ioctl_read_super(struct bch_fs *c,
>  		goto err;
>  	}
>  
> -	ret = copy_to_user((void __user *)(unsigned long)arg.sb,
> -			   sb, vstruct_bytes(sb));
> +	if (copy_to_user((void __user *)(unsigned long)arg.sb, sb,
> +			 vstruct_bytes(sb)))
> +		ret = -EFAULT;
>  err:
>  	if (!IS_ERR_OR_NULL(ca))
>  		percpu_ref_put(&ca->ref);
> -- 
> 2.39.2
> 



[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux