]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
PM / devfreq: rk3399_dmc: Avoid static (reused) profile
authorBrian Norris <briannorris@chromium.org>
Tue, 8 Mar 2022 19:09:01 +0000 (11:09 -0800)
committerChanwoo Choi <cw00.choi@samsung.com>
Wed, 13 Apr 2022 22:18:12 +0000 (07:18 +0900)
This static struct can get reused if the device gets removed/reprobed,
and that causes use-after-free in its ->freq_table.

Let's just move the struct to our dynamic allocation.

Signed-off-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
drivers/devfreq/rk3399_dmc.c

index 9615658d04ae364cacab10d8a1d53b5883fc8cdf..e494d1497d608bd028d640ad2662dd6bc4a431ef 100644 (file)
@@ -38,6 +38,7 @@
 struct rk3399_dmcfreq {
        struct device *dev;
        struct devfreq *devfreq;
+       struct devfreq_dev_profile profile;
        struct devfreq_simple_ondemand_data ondemand_data;
        struct clk *dmc_clk;
        struct devfreq_event_dev *edev;
@@ -228,13 +229,6 @@ static int rk3399_dmcfreq_get_cur_freq(struct device *dev, unsigned long *freq)
        return 0;
 }
 
-static struct devfreq_dev_profile rk3399_devfreq_dmc_profile = {
-       .polling_ms     = 200,
-       .target         = rk3399_dmcfreq_target,
-       .get_dev_status = rk3399_dmcfreq_get_dev_status,
-       .get_cur_freq   = rk3399_dmcfreq_get_cur_freq,
-};
-
 static __maybe_unused int rk3399_dmcfreq_suspend(struct device *dev)
 {
        struct rk3399_dmcfreq *dmcfreq = dev_get_drvdata(dev);
@@ -422,10 +416,16 @@ no_pmu:
        data->volt = dev_pm_opp_get_voltage(opp);
        dev_pm_opp_put(opp);
 
-       rk3399_devfreq_dmc_profile.initial_freq = data->rate;
+       data->profile = (struct devfreq_dev_profile) {
+               .polling_ms     = 200,
+               .target         = rk3399_dmcfreq_target,
+               .get_dev_status = rk3399_dmcfreq_get_dev_status,
+               .get_cur_freq   = rk3399_dmcfreq_get_cur_freq,
+               .initial_freq   = data->rate,
+       };
 
        data->devfreq = devm_devfreq_add_device(dev,
-                                          &rk3399_devfreq_dmc_profile,
+                                          &data->profile,
                                           DEVFREQ_GOV_SIMPLE_ONDEMAND,
                                           &data->ondemand_data);
        if (IS_ERR(data->devfreq)) {