summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEddie James <eajames@linux.vnet.ibm.com>2017-12-19 22:56:33 +0300
committerJoel Stanley <joel@jms.id.au>2018-01-16 20:54:30 +0300
commit4a2c3dea18a9adabe189e2afc89d0324f85331f9 (patch)
tree8a27408643583abc14099c8b5b2938ee1af82200
parent3a3b68911b4c48180e98a3f8b6ea595e9835bd69 (diff)
downloadlinux-4a2c3dea18a9adabe189e2afc89d0324f85331f9.tar.xz
hwmon (occ): Fix integer overflow in multiplication
Power values were overflowing INT_MAX when being converted to microwatts, even though the storage was sufficiently large (unsigned 64 bit). Change literals to unsigned long long. Also change tmep storage to u32 to avoid overflows at 65000 millidegrees. OpenBMC-Staging-Count: 1 Signed-off-by: Edward A. James <eajames@us.ibm.com> Signed-off-by: Joel Stanley <joel@jms.id.au>
-rw-r--r--drivers/hwmon/occ/common.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/hwmon/occ/common.c b/drivers/hwmon/occ/common.c
index 3175e7b27cc9..2e188d56099a 100644
--- a/drivers/hwmon/occ/common.c
+++ b/drivers/hwmon/occ/common.c
@@ -353,7 +353,7 @@ static ssize_t occ_show_temp_1(struct device *dev,
struct device_attribute *attr, char *buf)
{
int rc;
- u16 val = 0;
+ u32 val = 0;
struct temp_sensor_1 *temp;
struct occ *occ = dev_get_drvdata(dev);
struct occ_sensors *sensors = &occ->sensors;
@@ -468,7 +468,7 @@ static ssize_t occ_show_power_1(struct device *dev,
struct device_attribute *attr, char *buf)
{
int rc;
- u32 val = 0;
+ u64 val = 0;
struct power_sensor_1 *power;
struct occ *occ = dev_get_drvdata(dev);
struct occ_sensors *sensors = &occ->sensors;
@@ -491,11 +491,11 @@ static ssize_t occ_show_power_1(struct device *dev,
val = get_unaligned_be32(&power->accumulator);
break;
case 3:
- val = get_unaligned_be16(&power->value) * 1000000;
+ val = get_unaligned_be16(&power->value) * 1000000ULL;
break;
}
- return snprintf(buf, PAGE_SIZE - 1, "%u\n", val);
+ return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val);
}
static ssize_t occ_show_power_2(struct device *dev,
@@ -525,7 +525,7 @@ static ssize_t occ_show_power_2(struct device *dev,
val = get_unaligned_be64(&power->accumulator);
break;
case 3:
- val = get_unaligned_be16(&power->value) * 1000000;
+ val = get_unaligned_be16(&power->value) * 1000000ULL;
break;
case 4:
val = power->function_id;
@@ -562,7 +562,7 @@ static ssize_t occ_show_power_a0(struct device *dev,
val = get_unaligned_be16(&power->system.update_time);
break;
case 2:
- val = get_unaligned_be16(&power->system.value) * 1000000;
+ val = get_unaligned_be16(&power->system.value) * 1000000ULL;
break;
case 3:
val = get_unaligned_be32(&power->system.update_tag);
@@ -574,7 +574,7 @@ static ssize_t occ_show_power_a0(struct device *dev,
val = get_unaligned_be16(&power->proc.update_time);
break;
case 6:
- val = get_unaligned_be16(&power->proc.value) * 1000000;
+ val = get_unaligned_be16(&power->proc.value) * 1000000ULL;
break;
case 7:
val = get_unaligned_be32(&power->proc.update_tag);
@@ -583,7 +583,7 @@ static ssize_t occ_show_power_a0(struct device *dev,
val = get_unaligned_be64(&power->proc.accumulator);
break;
case 9:
- val = get_unaligned_be16(&power->vdd.value) * 1000000;
+ val = get_unaligned_be16(&power->vdd.value) * 1000000ULL;
break;
case 10:
val = get_unaligned_be32(&power->vdd.update_tag);
@@ -592,7 +592,7 @@ static ssize_t occ_show_power_a0(struct device *dev,
val = get_unaligned_be64(&power->vdd.accumulator);
break;
case 12:
- val = get_unaligned_be16(&power->vdn.value) * 1000000;
+ val = get_unaligned_be16(&power->vdn.value) * 1000000ULL;
break;
case 13:
val = get_unaligned_be32(&power->vdn.update_tag);