diff mbox series

drivers/fsi/scom: Return -EFAULT if copy fails

Message ID 20230519013710.34954-1-suhui@nfschina.com
State New
Headers show
Series drivers/fsi/scom: Return -EFAULT if copy fails | expand

Commit Message

Su Hui May 19, 2023, 1:37 a.m. UTC
The copy_to/from_user() functions return the number of bytes remaining
to be copied, but we want to return -EFAULT to the user.

Fixes: 680ca6dcf5c2 ("drivers/fsi: Add SCOM FSI client device driver")
Signed-off-by: Su Hui <suhui@nfschina.com>
---
 drivers/fsi/fsi-scom.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Guenter Roeck May 22, 2023, 10:30 p.m. UTC | #1
On Fri, May 19, 2023 at 09:37:10AM +0800, Su Hui wrote:
> The copy_to/from_user() functions return the number of bytes remaining
> to be copied, but we want to return -EFAULT to the user.
> 
Why ? EFAULT means that a bad address was provided, and it is not
immediately obvious why that would be the case.

Guenter

> Fixes: 680ca6dcf5c2 ("drivers/fsi: Add SCOM FSI client device driver")
> Signed-off-by: Su Hui <suhui@nfschina.com>
> ---
>  drivers/fsi/fsi-scom.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c
> index bcb756dc9866..caaf7738eb98 100644
> --- a/drivers/fsi/fsi-scom.c
> +++ b/drivers/fsi/fsi-scom.c
> @@ -335,7 +335,7 @@ static ssize_t scom_read(struct file *filep, char __user *buf, size_t len,
>  	if (rc)
>  		dev_dbg(dev, "copy to user failed:%d\n", rc);
>  
> -	return rc ? rc : len;
> +	return rc ? -EFAULT : len;
>  }
>  
>  static ssize_t scom_write(struct file *filep, const char __user *buf,
> -- 
> 2.30.2
>
Longsuhui May 23, 2023, 4:32 a.m. UTC | #2
On 2023/5/23 06:30, Guenter Roeck wrote:
> On Fri, May 19, 2023 at 09:37:10AM +0800, Su Hui wrote:
>> The copy_to/from_user() functions return the number of bytes remaining
>> to be copied, but we want to return -EFAULT to the user.
>>
> Why ? EFAULT means that a bad address was provided, and it is not
> immediately obvious why that would be the case.

When copy_to/from_user() functions failed, the error code is  -EFAULT in most case.
	
	git grep -A1 "copy_from_user" | grep EFAULT | wc -l
     1985
	git grep -A1 "copy_to_user" | grep EFAULT | wc -l
      1871

I think return -EFAULT is also right in this case.

Su Hui

> Guenter
>
>> Fixes: 680ca6dcf5c2 ("drivers/fsi: Add SCOM FSI client device driver")
>> Signed-off-by: Su Hui <suhui@nfschina.com>
>> ---
>>   drivers/fsi/fsi-scom.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c
>> index bcb756dc9866..caaf7738eb98 100644
>> --- a/drivers/fsi/fsi-scom.c
>> +++ b/drivers/fsi/fsi-scom.c
>> @@ -335,7 +335,7 @@ static ssize_t scom_read(struct file *filep, char __user *buf, size_t len,
>>   	if (rc)
>>   		dev_dbg(dev, "copy to user failed:%d\n", rc);
>>   
>> -	return rc ? rc : len;
>> +	return rc ? -EFAULT : len;
>>   }
>>   
>>   static ssize_t scom_write(struct file *filep, const char __user *buf,
>> -- 
>> 2.30.2
>>
Dan Carpenter May 23, 2023, 7:05 a.m. UTC | #3
On Mon, May 22, 2023 at 03:30:06PM -0700, Guenter Roeck wrote:
> On Fri, May 19, 2023 at 09:37:10AM +0800, Su Hui wrote:
> > The copy_to/from_user() functions return the number of bytes remaining
> > to be copied, but we want to return -EFAULT to the user.
> > 
> Why ? EFAULT means that a bad address was provided, and it is not
> immediately obvious why that would be the case.
> 

Right now the function is returning success so that's definitely wrong.
The copy_to/from_user() function will only fail if a bad address is
provided so -EFAULT is correct.

There is a different Smatch warning for when people return a different
error code such as -EINVAL.
drivers/fsi/fsi-scom.c:337 scom_read() warn: return -EFAULT instead of '-EINVAL'
The return affects the user and -EFAULT but that level of pendantry feel
like possibly too much?  There aren't many instances of this warning.

regards,
dan carpenter
diff mbox series

Patch

diff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c
index bcb756dc9866..caaf7738eb98 100644
--- a/drivers/fsi/fsi-scom.c
+++ b/drivers/fsi/fsi-scom.c
@@ -335,7 +335,7 @@  static ssize_t scom_read(struct file *filep, char __user *buf, size_t len,
 	if (rc)
 		dev_dbg(dev, "copy to user failed:%d\n", rc);
 
-	return rc ? rc : len;
+	return rc ? -EFAULT : len;
 }
 
 static ssize_t scom_write(struct file *filep, const char __user *buf,