drivers/cpufreq/qcom-cpufreq-hw.c:377 qcom_cpufreq_hw_cpu_init() error: we previously assumed 'data' could be null (see line 327)
From: Dan Carpenter
Date: Sat Feb 27 2021 - 04:27:42 EST
tree:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 8b83369ddcb3fb9cab5c1088987ce477565bb630
commit: 67fc209b527d023db4d087c68e44e9790aa089ef cpufreq: qcom-hw: drop devm_xxx() calls from init/exit hooks
config: arm64-randconfig-m031-20210226 (attached as .config)
compiler: aarch64-linux-gcc (GCC) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>
Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
smatch warnings:
drivers/cpufreq/qcom-cpufreq-hw.c:377 qcom_cpufreq_hw_cpu_init() error: we previously assumed 'data' could be null (see line 327)
drivers/cpufreq/qcom-cpufreq-hw.c:377 qcom_cpufreq_hw_cpu_init() error: dereferencing freed memory 'data'
vim +/data +377 drivers/cpufreq/qcom-cpufreq-hw.c
2849dd8bc72b62 Taniya Das 2018年12月14日 277 static int qcom_cpufreq_hw_cpu_init(struct cpufreq_policy *policy)
2849dd8bc72b62 Taniya Das 2018年12月14日 278 {
bd74e286b35413 Manivannan Sadhasivam 2020年09月08日 279 struct platform_device *pdev = cpufreq_get_driver_data();
bd74e286b35413 Manivannan Sadhasivam 2020年09月08日 280 struct device *dev = &pdev->dev;
2849dd8bc72b62 Taniya Das 2018年12月14日 281 struct of_phandle_args args;
2849dd8bc72b62 Taniya Das 2018年12月14日 282 struct device_node *cpu_np;
55538fbc79e926 Taniya Das 2019年01月31日 283 struct device *cpu_dev;
67fc209b527d02 Shawn Guo 2021年01月19日 284 struct resource *res;
2849dd8bc72b62 Taniya Das 2018年12月14日 285 void __iomem *base;
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 286 struct qcom_cpufreq_data *data;
2849dd8bc72b62 Taniya Das 2018年12月14日 287 int ret, index;
2849dd8bc72b62 Taniya Das 2018年12月14日 288
55538fbc79e926 Taniya Das 2019年01月31日 289 cpu_dev = get_cpu_device(policy->cpu);
55538fbc79e926 Taniya Das 2019年01月31日 290 if (!cpu_dev) {
55538fbc79e926 Taniya Das 2019年01月31日 291 pr_err("%s: failed to get cpu%d device\n", __func__,
55538fbc79e926 Taniya Das 2019年01月31日 292 policy->cpu);
55538fbc79e926 Taniya Das 2019年01月31日 293 return -ENODEV;
55538fbc79e926 Taniya Das 2019年01月31日 294 }
55538fbc79e926 Taniya Das 2019年01月31日 295
2849dd8bc72b62 Taniya Das 2018年12月14日 296 cpu_np = of_cpu_device_node_get(policy->cpu);
2849dd8bc72b62 Taniya Das 2018年12月14日 297 if (!cpu_np)
2849dd8bc72b62 Taniya Das 2018年12月14日 298 return -EINVAL;
2849dd8bc72b62 Taniya Das 2018年12月14日 299
2849dd8bc72b62 Taniya Das 2018年12月14日 300 ret = of_parse_phandle_with_args(cpu_np, "qcom,freq-domain",
2849dd8bc72b62 Taniya Das 2018年12月14日 301 "#freq-domain-cells", 0, &args);
2849dd8bc72b62 Taniya Das 2018年12月14日 302 of_node_put(cpu_np);
2849dd8bc72b62 Taniya Das 2018年12月14日 303 if (ret)
2849dd8bc72b62 Taniya Das 2018年12月14日 304 return ret;
2849dd8bc72b62 Taniya Das 2018年12月14日 305
2849dd8bc72b62 Taniya Das 2018年12月14日 306 index = args.args[0];
2849dd8bc72b62 Taniya Das 2018年12月14日 307
67fc209b527d02 Shawn Guo 2021年01月19日 308 res = platform_get_resource(pdev, IORESOURCE_MEM, index);
67fc209b527d02 Shawn Guo 2021年01月19日 309 if (!res) {
67fc209b527d02 Shawn Guo 2021年01月19日 310 dev_err(dev, "failed to get mem resource %d\n", index);
67fc209b527d02 Shawn Guo 2021年01月19日 311 return -ENODEV;
67fc209b527d02 Shawn Guo 2021年01月19日 312 }
67fc209b527d02 Shawn Guo 2021年01月19日 313
67fc209b527d02 Shawn Guo 2021年01月19日 314 if (!request_mem_region(res->start, resource_size(res), res->name)) {
67fc209b527d02 Shawn Guo 2021年01月19日 315 dev_err(dev, "failed to request resource %pR\n", res);
67fc209b527d02 Shawn Guo 2021年01月19日 316 return -EBUSY;
67fc209b527d02 Shawn Guo 2021年01月19日 317 }
2849dd8bc72b62 Taniya Das 2018年12月14日 318
67fc209b527d02 Shawn Guo 2021年01月19日 319 base = ioremap(res->start, resource_size(res));
67fc209b527d02 Shawn Guo 2021年01月19日 320 if (IS_ERR(base)) {
67fc209b527d02 Shawn Guo 2021年01月19日 321 dev_err(dev, "failed to map resource %pR\n", res);
67fc209b527d02 Shawn Guo 2021年01月19日 322 ret = PTR_ERR(base);
67fc209b527d02 Shawn Guo 2021年01月19日 323 goto release_region;
67fc209b527d02 Shawn Guo 2021年01月19日 324 }
67fc209b527d02 Shawn Guo 2021年01月19日 325
67fc209b527d02 Shawn Guo 2021年01月19日 326 data = kzalloc(sizeof(*data), GFP_KERNEL);
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 @327 if (!data) {
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 328 ret = -ENOMEM;
67fc209b527d02 Shawn Guo 2021年01月19日 329 goto unmap_base;
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 330 }
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 331
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 332 data->soc_data = of_device_get_match_data(&pdev->dev);
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 333 data->base = base;
67fc209b527d02 Shawn Guo 2021年01月19日 334 data->res = res;
2849dd8bc72b62 Taniya Das 2018年12月14日 335
2849dd8bc72b62 Taniya Das 2018年12月14日 336 /* HW should be in enabled state to proceed */
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 337 if (!(readl_relaxed(base + data->soc_data->reg_enable) & 0x1)) {
2849dd8bc72b62 Taniya Das 2018年12月14日 338 dev_err(dev, "Domain-%d cpufreq hardware not enabled\n", index);
2849dd8bc72b62 Taniya Das 2018年12月14日 339 ret = -ENODEV;
2849dd8bc72b62 Taniya Das 2018年12月14日 340 goto error;
2849dd8bc72b62 Taniya Das 2018年12月14日 341 }
2849dd8bc72b62 Taniya Das 2018年12月14日 342
2849dd8bc72b62 Taniya Das 2018年12月14日 343 qcom_get_related_cpus(index, policy->cpus);
2849dd8bc72b62 Taniya Das 2018年12月14日 344 if (!cpumask_weight(policy->cpus)) {
2849dd8bc72b62 Taniya Das 2018年12月14日 345 dev_err(dev, "Domain-%d failed to get related CPUs\n", index);
2849dd8bc72b62 Taniya Das 2018年12月14日 346 ret = -ENOENT;
2849dd8bc72b62 Taniya Das 2018年12月14日 347 goto error;
2849dd8bc72b62 Taniya Das 2018年12月14日 348 }
2849dd8bc72b62 Taniya Das 2018年12月14日 349
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 350 policy->driver_data = data;
2849dd8bc72b62 Taniya Das 2018年12月14日 351
dcd1fd724c19fe Manivannan Sadhasivam 2020年09月15日 352 ret = qcom_cpufreq_hw_read_lut(cpu_dev, policy);
2849dd8bc72b62 Taniya Das 2018年12月14日 353 if (ret) {
2849dd8bc72b62 Taniya Das 2018年12月14日 354 dev_err(dev, "Domain-%d failed to read LUT\n", index);
2849dd8bc72b62 Taniya Das 2018年12月14日 355 goto error;
2849dd8bc72b62 Taniya Das 2018年12月14日 356 }
2849dd8bc72b62 Taniya Das 2018年12月14日 357
55538fbc79e926 Taniya Das 2019年01月31日 358 ret = dev_pm_opp_get_opp_count(cpu_dev);
55538fbc79e926 Taniya Das 2019年01月31日 359 if (ret <= 0) {
55538fbc79e926 Taniya Das 2019年01月31日 360 dev_err(cpu_dev, "Failed to add OPPs\n");
55538fbc79e926 Taniya Das 2019年01月31日 361 ret = -ENODEV;
55538fbc79e926 Taniya Das 2019年01月31日 362 goto error;
55538fbc79e926 Taniya Das 2019年01月31日 363 }
55538fbc79e926 Taniya Das 2019年01月31日 364
0e0ffa855d1590 Lukasz Luba 2020年05月27日 365 dev_pm_opp_of_register_em(cpu_dev, policy->cpus);
dab535052f67db Matthias Kaehlcke 2019年02月05日 366
266991721c15f9 Shawn Guo 2021年01月13日 367 if (policy_has_boost_freq(policy)) {
266991721c15f9 Shawn Guo 2021年01月13日 368 ret = cpufreq_enable_boost_support();
266991721c15f9 Shawn Guo 2021年01月13日 369 if (ret)
266991721c15f9 Shawn Guo 2021年01月13日 370 dev_warn(cpu_dev, "failed to enable boost: %d\n", ret);
266991721c15f9 Shawn Guo 2021年01月13日 371 }
266991721c15f9 Shawn Guo 2021年01月13日 372
2849dd8bc72b62 Taniya Das 2018年12月14日 373 return 0;
2849dd8bc72b62 Taniya Das 2018年12月14日 374 error:
67fc209b527d02 Shawn Guo 2021年01月19日 375 kfree(data);
67fc209b527d02 Shawn Guo 2021年01月19日 376 unmap_base:
67fc209b527d02 Shawn Guo 2021年01月19日 @377 iounmap(data->base);
Use after free. iounmap(base);
67fc209b527d02 Shawn Guo 2021年01月19日 378 release_region:
67fc209b527d02 Shawn Guo 2021年01月19日 379 release_mem_region(res->start, resource_size(res));
2849dd8bc72b62 Taniya Das 2018年12月14日 380 return ret;
2849dd8bc72b62 Taniya Das 2018年12月14日 381 }
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip