FAILED: patch "[PATCH] hwmon: (occ) Fix potential integer overflow" failed to apply to 4.20-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.20-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b0407d820b65272fcaa77e0dd1347dc7678d23b8 Mon Sep 17 00:00:00 2001
From: "Gustavo A. R. Silva" <[email protected]>
Date: Mon, 7 Jan 2019 12:34:31 -0600
Subject: [PATCH] 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")
drivers/hwmon/occ/common.c +12 -12
@@ -380,8 +380,8 @@ static ssize_t occ_show_power_1(struct device *dev, val *=1000000ULL ;break ;case 2 : - val =get_unaligned_be32 (&power->update_tag) * - occ->powr_sample_time_us; + val = (u64 )get_unaligned_be32 (&power->update_tag) * + occ->powr_sample_time_us;break ;case 3 : val =get_unaligned_be16 (&power->value) *1000000ULL ;
@@ -425,8 +425,8 @@ static ssize_t occ_show_power_2(struct device *dev, &power->update_tag);break ;case 2 : - val =get_unaligned_be32 (&power->update_tag) * - occ->powr_sample_time_us; + val = (u64 )get_unaligned_be32 (&power->update_tag) * + occ->powr_sample_time_us;break ;case 3 : val =get_unaligned_be16 (&power->value) *1000000ULL ;
@@ -463,8 +463,8 @@ static ssize_t occ_show_power_a0(struct device *dev, &power->system.update_tag);break ;case 2 : - val =get_unaligned_be32 (&power->system.update_tag) * - occ->powr_sample_time_us; + val = (u64 )get_unaligned_be32 (&power->system.update_tag) * + occ->powr_sample_time_us;break ;case 3 : val =get_unaligned_be16 (&power->system.value) *1000000ULL ;
@@ -477,8 +477,8 @@ static ssize_t occ_show_power_a0(struct device *dev, &power->proc.update_tag);break ;case 6 : - val =get_unaligned_be32 (&power->proc.update_tag) * - occ->powr_sample_time_us; + val = (u64 )get_unaligned_be32 (&power->proc.update_tag) * + occ->powr_sample_time_us;break ;case 7 : val =get_unaligned_be16 (&power->proc.value) *1000000ULL ;
@@ -491,8 +491,8 @@ static ssize_t occ_show_power_a0(struct device *dev, &power->vdd.update_tag);break ;case 10 : - val =get_unaligned_be32 (&power->vdd.update_tag) * - occ->powr_sample_time_us; + val = (u64 )get_unaligned_be32 (&power->vdd.update_tag) * + occ->powr_sample_time_us;break ;case 11 : val =get_unaligned_be16 (&power->vdd.value) *1000000ULL ;
@@ -505,8 +505,8 @@ static ssize_t occ_show_power_a0(struct device *dev, &power->vdn.update_tag);break ;case 14 : - val =get_unaligned_be32 (&power->vdn.update_tag) * - occ->powr_sample_time_us; + val = (u64 )get_unaligned_be32 (&power->vdn.update_tag) * + occ->powr_sample_time_us;break ;case 15 : val =get_unaligned_be16 (&power->vdn.value) *1000000ULL ;