PM: domains: fix integer overflow issues in genpd_parse_state()
authorNikita Zhandarovich <n.zhandarovich@fintech.ru>
Tue, 18 Apr 2023 13:07:43 +0000 (06:07 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 24 May 2023 16:37:28 +0000 (18:37 +0200)
Currently, while calculating residency and latency values, right
operands may overflow if resulting values are big enough.

To prevent this, albeit unlikely case, play it safe and convert
right operands to left ones' type s64.

Found by Linux Verification Center (linuxtesting.org) with static
analysis tool SVACE.

Fixes: 30f604283e05 ("PM / Domains: Allow domain power states to be read from DT")
Signed-off-by: Nikita Zhandarovich <n.zhandarovich@fintech.ru>
Acked-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/base/power/domain.c

index 32084e38b73d01f58ae1a5a9f5beb759e1328a88..51b9d4eaab5ea94467443dd4da03ad92fb14297b 100644 (file)
@@ -2939,10 +2939,10 @@ static int genpd_parse_state(struct genpd_power_state *genpd_state,
 
        err = of_property_read_u32(state_node, "min-residency-us", &residency);
        if (!err)
-               genpd_state->residency_ns = 1000 * residency;
+               genpd_state->residency_ns = 1000LL * residency;
 
-       genpd_state->power_on_latency_ns = 1000 * exit_latency;
-       genpd_state->power_off_latency_ns = 1000 * entry_latency;
+       genpd_state->power_on_latency_ns = 1000LL * exit_latency;
+       genpd_state->power_off_latency_ns = 1000LL * entry_latency;
        genpd_state->fwnode = &state_node->fwnode;
 
        return 0;