diff options
author | Jean Delvare <khali@linux-fr.org> | 2012-12-19 16:17:00 -0500 |
---|---|---|
committer | Jean Delvare <khali@endymion.delvare> | 2012-12-19 16:17:00 -0500 |
commit | 45633fb370fdd16608756d587245459bf8983a26 (patch) | |
tree | c5f840fea63b034ef56f1bd15179ddae20790f25 /drivers/hwmon | |
parent | 8f3c7c547d47bcfcf9ca2ed30b79733ce1e7ad3a (diff) |
hwmon: (w83627ehf) Get rid of smatch warnings
The smatch static code analyzer complains:
drivers/hwmon/w83627ehf.c:911 w83627ehf_update_device() error: buffer overflow 'W83627EHF_REG_TEMP_OFFSET' 3 <= 8
drivers/hwmon/w83627ehf.c:909 w83627ehf_update_device() error: buffer overflow 'data->temp_offset' 3 <= 8
drivers/hwmon/w83627ehf.c:2672 w83627ehf_resume() error: buffer overflow 'W83627EHF_REG_TEMP_OFFSET' 3 <= 8
drivers/hwmon/w83627ehf.c:2673 w83627ehf_resume() error: buffer overflow 'data->temp_offset' 3 <= 8
A deeper analysis of the code shows that these are false positives, as
only the lower 3 bits of data->have_temp_offset can be set so the
write is never attempted with i >= 3. However this shows that the code
isn't very robust and future changes could easily introduce a buffer
overflow. So let's add a safety check to prevent that and make smatch
happy.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Peter Huewe <PeterHuewe@gmx.de>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/w83627ehf.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c index 7fbd0ba0f26f..0e8ffd6059a0 100644 --- a/drivers/hwmon/w83627ehf.c +++ b/drivers/hwmon/w83627ehf.c | |||
@@ -905,6 +905,8 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev) | |||
905 | data->temp_max_hyst[i] | 905 | data->temp_max_hyst[i] |
906 | = w83627ehf_read_temp(data, | 906 | = w83627ehf_read_temp(data, |
907 | data->reg_temp_hyst[i]); | 907 | data->reg_temp_hyst[i]); |
908 | if (i > 2) | ||
909 | continue; | ||
908 | if (data->have_temp_offset & (1 << i)) | 910 | if (data->have_temp_offset & (1 << i)) |
909 | data->temp_offset[i] | 911 | data->temp_offset[i] |
910 | = w83627ehf_read_value(data, | 912 | = w83627ehf_read_value(data, |
@@ -2670,6 +2672,8 @@ static int w83627ehf_resume(struct device *dev) | |||
2670 | if (data->reg_temp_hyst[i]) | 2672 | if (data->reg_temp_hyst[i]) |
2671 | w83627ehf_write_temp(data, data->reg_temp_hyst[i], | 2673 | w83627ehf_write_temp(data, data->reg_temp_hyst[i], |
2672 | data->temp_max_hyst[i]); | 2674 | data->temp_max_hyst[i]); |
2675 | if (i > 2) | ||
2676 | continue; | ||
2673 | if (data->have_temp_offset & (1 << i)) | 2677 | if (data->have_temp_offset & (1 << i)) |
2674 | w83627ehf_write_value(data, | 2678 | w83627ehf_write_value(data, |
2675 | W83627EHF_REG_TEMP_OFFSET[i], | 2679 | W83627EHF_REG_TEMP_OFFSET[i], |