hwmon: (f71882fg) prevent possible division by zero

Message ID 20230510143537.145060-1-n.zhandarovich@fintech.ru
State New
Headers
Series hwmon: (f71882fg) prevent possible division by zero |

Commit Message

Nikita Zhandarovich May 10, 2023, 2:35 p.m. UTC
  In the unlikely event that something goes wrong with the device and
its registers, the fan_from_reg() function may return 0. This value
will cause a division-by-zero error in the show_pwm() function.

To prevent this, test the value of
fan_from_reg(data->fan_full_speed[nr]) against 0 before performing
the division. If the division-by-zero error is avoided, assign 0 to
the val variable.

Found by Linux Verification Center (linuxtesting.org) with static
analysis tool SVACE.

Fixes: df9ec2dae094 ("hwmon: (f71882fg) Reorder symbols to get rid of a few forward declarations")
Signed-off-by: Nikita Zhandarovich <n.zhandarovich@fintech.ru>
---
 drivers/hwmon/f71882fg.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
  

Comments

Guenter Roeck May 19, 2023, 12:59 p.m. UTC | #1
On Wed, May 10, 2023 at 07:35:37AM -0700, Nikita Zhandarovich wrote:
> In the unlikely event that something goes wrong with the device and
> its registers, the fan_from_reg() function may return 0. This value
> will cause a division-by-zero error in the show_pwm() function.
> 
> To prevent this, test the value of
> fan_from_reg(data->fan_full_speed[nr]) against 0 before performing
> the division. If the division-by-zero error is avoided, assign 0 to
> the val variable.
> 
> Found by Linux Verification Center (linuxtesting.org) with static
> analysis tool SVACE.
> 
> Fixes: df9ec2dae094 ("hwmon: (f71882fg) Reorder symbols to get rid of a few forward declarations")
> Signed-off-by: Nikita Zhandarovich <n.zhandarovich@fintech.ru>

Applied.

Thanks,
Guenter

> ---
>  drivers/hwmon/f71882fg.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c
> index 70121482a617..27207ec6f7fe 100644
> --- a/drivers/hwmon/f71882fg.c
> +++ b/drivers/hwmon/f71882fg.c
> @@ -1096,8 +1096,11 @@ static ssize_t show_pwm(struct device *dev,
>  		val = data->pwm[nr];
>  	else {
>  		/* RPM mode */
> -		val = 255 * fan_from_reg(data->fan_target[nr])
> -			/ fan_from_reg(data->fan_full_speed[nr]);
> +		if (fan_from_reg(data->fan_full_speed[nr]))
> +			val = 255 * fan_from_reg(data->fan_target[nr])
> +				/ fan_from_reg(data->fan_full_speed[nr]);
> +		else
> +			val = 0;
>  	}
>  	mutex_unlock(&data->update_lock);
>  	return sprintf(buf, "%d\n", val);
  

Patch

diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c
index 70121482a617..27207ec6f7fe 100644
--- a/drivers/hwmon/f71882fg.c
+++ b/drivers/hwmon/f71882fg.c
@@ -1096,8 +1096,11 @@  static ssize_t show_pwm(struct device *dev,
 		val = data->pwm[nr];
 	else {
 		/* RPM mode */
-		val = 255 * fan_from_reg(data->fan_target[nr])
-			/ fan_from_reg(data->fan_full_speed[nr]);
+		if (fan_from_reg(data->fan_full_speed[nr]))
+			val = 255 * fan_from_reg(data->fan_target[nr])
+				/ fan_from_reg(data->fan_full_speed[nr]);
+		else
+			val = 0;
 	}
 	mutex_unlock(&data->update_lock);
 	return sprintf(buf, "%d\n", val);