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; |