diff options
| author | Gustavo A. R. Silva <gustavo@embeddedor.com> | 2019-01-07 13:34:31 -0500 |
|---|---|---|
| committer | Guenter Roeck <linux@roeck-us.net> | 2019-01-08 00:03:59 -0500 |
| commit | b0407d820b65272fcaa77e0dd1347dc7678d23b8 (patch) | |
| tree | 6c9f6ce525882217fb0ee72a1f5cd02d0a9d34a1 | |
| parent | 07bd14ccc3049f9c0147a91a4227a571f981601a (diff) | |
hwmon: (occ) Fix potential integer overflow
Cast get_unaligned_be32(...) to u64 in order to give the compiler
complete information about the proper arithmetic to use and avoid
a potential integer overflow.
Notice that such function call is used in contexts that expect
expressions of type u64 (64 bits, unsigned); and the following
expressions are currently being evaluated using 32-bit
arithmetic:
val = get_unaligned_be32(&power->update_tag) *
occ->powr_sample_time_us;
val = get_unaligned_be32(&power->vdn.update_tag) *
occ->powr_sample_time_us;
Addresses-Coverity-ID: 1442357 ("Unintentional integer overflow")
Addresses-Coverity-ID: 1442476 ("Unintentional integer overflow")
Addresses-Coverity-ID: 1442508 ("Unintentional integer overflow")
Fixes: ff692d80b2e2 ("hwmon (occ): Add sensor types and versions")
Cc: stable@vger.kernel.org
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Reviewed-by: Eddie James <eajames@linux.ibm.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
| -rw-r--r-- | drivers/hwmon/occ/common.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/hwmon/occ/common.c b/drivers/hwmon/occ/common.c index 423903f87955..391118c8aae8 100644 --- a/drivers/hwmon/occ/common.c +++ b/drivers/hwmon/occ/common.c | |||
| @@ -380,8 +380,8 @@ static ssize_t occ_show_power_1(struct device *dev, | |||
| 380 | val *= 1000000ULL; | 380 | val *= 1000000ULL; |
| 381 | break; | 381 | break; |
| 382 | case 2: | 382 | case 2: |
| 383 | val = get_unaligned_be32(&power->update_tag) * | 383 | val = (u64)get_unaligned_be32(&power->update_tag) * |
| 384 | occ->powr_sample_time_us; | 384 | occ->powr_sample_time_us; |
| 385 | break; | 385 | break; |
| 386 | case 3: | 386 | case 3: |
| 387 | val = get_unaligned_be16(&power->value) * 1000000ULL; | 387 | val = get_unaligned_be16(&power->value) * 1000000ULL; |
| @@ -425,8 +425,8 @@ static ssize_t occ_show_power_2(struct device *dev, | |||
| 425 | &power->update_tag); | 425 | &power->update_tag); |
| 426 | break; | 426 | break; |
| 427 | case 2: | 427 | case 2: |
| 428 | val = get_unaligned_be32(&power->update_tag) * | 428 | val = (u64)get_unaligned_be32(&power->update_tag) * |
| 429 | occ->powr_sample_time_us; | 429 | occ->powr_sample_time_us; |
| 430 | break; | 430 | break; |
| 431 | case 3: | 431 | case 3: |
| 432 | val = get_unaligned_be16(&power->value) * 1000000ULL; | 432 | val = get_unaligned_be16(&power->value) * 1000000ULL; |
| @@ -463,8 +463,8 @@ static ssize_t occ_show_power_a0(struct device *dev, | |||
| 463 | &power->system.update_tag); | 463 | &power->system.update_tag); |
| 464 | break; | 464 | break; |
| 465 | case 2: | 465 | case 2: |
| 466 | val = get_unaligned_be32(&power->system.update_tag) * | 466 | val = (u64)get_unaligned_be32(&power->system.update_tag) * |
| 467 | occ->powr_sample_time_us; | 467 | occ->powr_sample_time_us; |
| 468 | break; | 468 | break; |
| 469 | case 3: | 469 | case 3: |
| 470 | val = get_unaligned_be16(&power->system.value) * 1000000ULL; | 470 | val = get_unaligned_be16(&power->system.value) * 1000000ULL; |
| @@ -477,8 +477,8 @@ static ssize_t occ_show_power_a0(struct device *dev, | |||
| 477 | &power->proc.update_tag); | 477 | &power->proc.update_tag); |
| 478 | break; | 478 | break; |
| 479 | case 6: | 479 | case 6: |
| 480 | val = get_unaligned_be32(&power->proc.update_tag) * | 480 | val = (u64)get_unaligned_be32(&power->proc.update_tag) * |
| 481 | occ->powr_sample_time_us; | 481 | occ->powr_sample_time_us; |
| 482 | break; | 482 | break; |
| 483 | case 7: | 483 | case 7: |
| 484 | val = get_unaligned_be16(&power->proc.value) * 1000000ULL; | 484 | val = get_unaligned_be16(&power->proc.value) * 1000000ULL; |
| @@ -491,8 +491,8 @@ static ssize_t occ_show_power_a0(struct device *dev, | |||
| 491 | &power->vdd.update_tag); | 491 | &power->vdd.update_tag); |
| 492 | break; | 492 | break; |
| 493 | case 10: | 493 | case 10: |
| 494 | val = get_unaligned_be32(&power->vdd.update_tag) * | 494 | val = (u64)get_unaligned_be32(&power->vdd.update_tag) * |
| 495 | occ->powr_sample_time_us; | 495 | occ->powr_sample_time_us; |
| 496 | break; | 496 | break; |
| 497 | case 11: | 497 | case 11: |
| 498 | val = get_unaligned_be16(&power->vdd.value) * 1000000ULL; | 498 | val = get_unaligned_be16(&power->vdd.value) * 1000000ULL; |
| @@ -505,8 +505,8 @@ static ssize_t occ_show_power_a0(struct device *dev, | |||
| 505 | &power->vdn.update_tag); | 505 | &power->vdn.update_tag); |
| 506 | break; | 506 | break; |
| 507 | case 14: | 507 | case 14: |
| 508 | val = get_unaligned_be32(&power->vdn.update_tag) * | 508 | val = (u64)get_unaligned_be32(&power->vdn.update_tag) * |
| 509 | occ->powr_sample_time_us; | 509 | occ->powr_sample_time_us; |
| 510 | break; | 510 | break; |
| 511 | case 15: | 511 | case 15: |
| 512 | val = get_unaligned_be16(&power->vdn.value) * 1000000ULL; | 512 | val = get_unaligned_be16(&power->vdn.value) * 1000000ULL; |
