hwmon: (ntc_thermistor) return error instead of clipping on OOB
authorMaud Spierings <maudspierings@gocontroll.com>
Fri, 7 Mar 2025 08:10:43 +0000 (09:10 +0100)
committerGuenter Roeck <linux@roeck-us.net>
Fri, 7 Mar 2025 14:57:52 +0000 (06:57 -0800)
When the ntc is reading Out Of Bounds instead of clipping to the nearest
limit (min/max) return -ENODATA. This prevents malfunctioning sensors
from sending a device into a shutdown loop due to a critical trip.

This implementation will only work for ntc type thermistors if a ptc
type is to be implemented the min/max ohm calculation must be adjusted
to take that into account.

Signed-off-by: Maud Spierings <maudspierings@gocontroll.com>
Link: https://lore.kernel.org/r/20250307-ntc_oob-v2-1-bba2d32b1a8e@gocontroll.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/ntc_thermistor.c

index b5352900463fb9b4fc68605a73feb8875961f554..7c759669b26fa9019d619965836dd6807dc7e9be 100644 (file)
@@ -387,12 +387,9 @@ static int get_ohm_of_thermistor(struct ntc_data *data, unsigned int uv)
        puo = data->pullup_ohm;
        pdo = data->pulldown_ohm;
 
-       if (uv == 0)
-               return (data->connect == NTC_CONNECTED_POSITIVE) ?
-                       INT_MAX : 0;
-       if (uv >= puv)
-               return (data->connect == NTC_CONNECTED_POSITIVE) ?
-                       0 : INT_MAX;
+       /* faulty adc value */
+       if (uv == 0 || uv >= puv)
+               return -ENODATA;
 
        if (data->connect == NTC_CONNECTED_POSITIVE && puo == 0)
                n = div_u64(pdo * (puv - uv), uv);
@@ -404,8 +401,10 @@ static int get_ohm_of_thermistor(struct ntc_data *data, unsigned int uv)
        else
                n = div64_u64_safe(pdo * puo * uv, pdo * (puv - uv) - puo * uv);
 
-       if (n > INT_MAX)
-               n = INT_MAX;
+       /* sensor out of bounds */
+       if (n > data->comp[0].ohm || n < data->comp[data->n_comp - 1].ohm)
+               return -ENODATA;
+
        return n;
 }