interconnect: qcom: msm8974: Prevent integer overflow in rate
authorGeorgi Djakov <georgi.djakov@linaro.org>
Fri, 6 Nov 2020 14:48:47 +0000 (16:48 +0200)
committerGeorgi Djakov <georgi.djakov@linaro.org>
Tue, 17 Nov 2020 22:18:05 +0000 (00:18 +0200)
When sync_state support got introduced recently, by default we try to
set the NoCs to run initially at maximum rate. But as these values are
aggregated, we may end with a really big clock rate value, which is
then converted from "u64" to "long" during the clock rate rounding.
But on 32bit platforms this may result an overflow. Fix it by making
sure that the rate is within range.

Reported-by: Luca Weiss <luca@z3ntu.xyz>
Reviewed-by: Brian Masney <masneyb@onstation.org>
Link: https://lore.kernel.org/r/20201106144847.7726-1-georgi.djakov@linaro.org
Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
drivers/interconnect/qcom/msm8974.c

index 3a313e11e73d76bf1f5392343d8d6aead33c1eb4..b6b639dad69160bf8f4a1f1e95c488ca43f0b240 100644 (file)
@@ -618,6 +618,8 @@ static int msm8974_icc_set(struct icc_node *src, struct icc_node *dst)
 
        do_div(rate, src_qn->buswidth);
 
+       rate = min_t(u32, rate, INT_MAX);
+
        if (src_qn->rate == rate)
                return 0;
 
@@ -758,6 +760,7 @@ static struct platform_driver msm8974_noc_driver = {
        .driver = {
                .name = "qnoc-msm8974",
                .of_match_table = msm8974_noc_of_match,
+               .sync_state = icc_sync_state,
        },
 };
 module_platform_driver(msm8974_noc_driver);