From fb884933da3cbae03be161cbcc70e93eb158da46 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Sat, 5 Jun 2004 09:54:33 +0000 Subject: [PATCH] Prevent fan_min overflow when changing fan_div. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2580 7894878c-1315-0410-8ee3-d5d059ff63e0 --- kernel/chips/adm1031.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/kernel/chips/adm1031.c b/kernel/chips/adm1031.c index 1eab784c..e1f34785 100644 --- a/kernel/chips/adm1031.c +++ b/kernel/chips/adm1031.c @@ -610,26 +610,29 @@ static void adm1031_fan_div(struct i2c_client *client, int operation, *nrels_mag = 2; } } else if (operation == SENSORS_PROC_REAL_WRITE) { + int old_div, new_min; if (*nrels_mag >= 1) { - int old_div = FAN_DIV_FROM_REG(data->fan_div[0]); + old_div = FAN_DIV_FROM_REG(data->fan_div[0]); data->fan_div[0] = FAN_DIV_TO_REG(results[0]); adm1031_write_value(client, ADM1031_REG_FAN_DIV(0), data->fan_div[0]); - data->fan_min[0] = data->fan_min[0] * old_div / - FAN_DIV_FROM_REG(data->fan_div[0]); + new_min = data->fan_min[0] * old_div / + FAN_DIV_FROM_REG(data->fan_div[0]); + data->fan_min[0] = new_min > 0xff ? 0xff : new_min; adm1031_write_value(client, ADM1031_REG_FAN_MIN(0), data->fan_min[0]); } if (*nrels_mag >= 2) { - int old_div = FAN_DIV_FROM_REG(data->fan_div[1]); + old_div = FAN_DIV_FROM_REG(data->fan_div[1]); data->fan_div[1] = FAN_DIV_TO_REG(results[1]); adm1031_write_value(client, ADM1031_REG_FAN_DIV(1), data->fan_div[1]); - data->fan_min[1] = data->fan_min[1] * old_div / - FAN_DIV_FROM_REG(data->fan_div[1]); + new_min = data->fan_min[1] * old_div / + FAN_DIV_FROM_REG(data->fan_div[1]); + data->fan_min[1] = new_min > 0xff ? 0xff : new_min; adm1031_write_value(client, ADM1031_REG_FAN_MIN(1), data->fan_min[1]);