hwmon: (nct6775) Fix access to fan pulse registers
Not all fans have a fan pulse register. This can result in reading
beyond the end of REG_FAN_PULSES and FAN_PULSE_SHIFT arrays,
and was reported by smatch as possible error.
1672 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) {
^^^^^^^^^^^^^^^^^^^^^^^^
This is a 7 element array.
...
1685 data->fan_pulses[i] =
1686 (nct6775_read_value(data, data->REG_FAN_PULSES[i])
1687 >> data->FAN_PULSE_SHIFT[i]) & 0x03;
^^^^^^^^^^^^^^^^^^^^^^^^
FAN_PULSE_SHIFT is either 5 or 6
elements.
To fix the problem, we have to ensure that all REG_FAN_PULSES and
FAN_PULSE_SHIFT have the appropriate length, and that REG_FAN_PULSES
is only read if the register actually exists.
Fixes: 6c009501ff
("hwmon: (nct6775) Add support for NCT6102D/6106D")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
e3f3d7ab00
commit
c793279c77
|
@ -299,8 +299,9 @@ static const u16 NCT6775_REG_PWM_READ[] = {
|
|||
|
||||
static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 };
|
||||
static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d };
|
||||
static const u16 NCT6775_REG_FAN_PULSES[] = { 0x641, 0x642, 0x643, 0x644, 0 };
|
||||
static const u16 NCT6775_FAN_PULSE_SHIFT[] = { 0, 0, 0, 0, 0, 0 };
|
||||
static const u16 NCT6775_REG_FAN_PULSES[NUM_FAN] = {
|
||||
0x641, 0x642, 0x643, 0x644 };
|
||||
static const u16 NCT6775_FAN_PULSE_SHIFT[NUM_FAN] = { };
|
||||
|
||||
static const u16 NCT6775_REG_TEMP[] = {
|
||||
0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d };
|
||||
|
@ -425,8 +426,8 @@ static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 };
|
|||
|
||||
static const u16 NCT6776_REG_FAN_MIN[] = {
|
||||
0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a, 0x64c };
|
||||
static const u16 NCT6776_REG_FAN_PULSES[] = {
|
||||
0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0 };
|
||||
static const u16 NCT6776_REG_FAN_PULSES[NUM_FAN] = {
|
||||
0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
|
||||
|
||||
static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = {
|
||||
0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e };
|
||||
|
@ -502,8 +503,8 @@ static const s8 NCT6779_BEEP_BITS[] = {
|
|||
|
||||
static const u16 NCT6779_REG_FAN[] = {
|
||||
0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8, 0x4ba, 0x660 };
|
||||
static const u16 NCT6779_REG_FAN_PULSES[] = {
|
||||
0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0 };
|
||||
static const u16 NCT6779_REG_FAN_PULSES[NUM_FAN] = {
|
||||
0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
|
||||
|
||||
static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = {
|
||||
0x136, 0x236, 0x336, 0x836, 0x936, 0xa36, 0xb36 };
|
||||
|
@ -779,8 +780,8 @@ static const u16 NCT6106_REG_TEMP_CONFIG[] = {
|
|||
|
||||
static const u16 NCT6106_REG_FAN[] = { 0x20, 0x22, 0x24 };
|
||||
static const u16 NCT6106_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4 };
|
||||
static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6, 0, 0 };
|
||||
static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4, 0, 0 };
|
||||
static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6 };
|
||||
static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4 };
|
||||
|
||||
static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 };
|
||||
static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 };
|
||||
|
@ -1682,9 +1683,13 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
|
|||
if (data->has_fan_min & BIT(i))
|
||||
data->fan_min[i] = nct6775_read_value(data,
|
||||
data->REG_FAN_MIN[i]);
|
||||
data->fan_pulses[i] =
|
||||
(nct6775_read_value(data, data->REG_FAN_PULSES[i])
|
||||
>> data->FAN_PULSE_SHIFT[i]) & 0x03;
|
||||
|
||||
if (data->REG_FAN_PULSES[i]) {
|
||||
data->fan_pulses[i] =
|
||||
(nct6775_read_value(data,
|
||||
data->REG_FAN_PULSES[i])
|
||||
>> data->FAN_PULSE_SHIFT[i]) & 0x03;
|
||||
}
|
||||
|
||||
nct6775_select_fan_div(dev, data, i, reg);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue