Skip to content
This repository was archived by the owner on Jul 3, 2018. It is now read-only.

Commit 5c51588

Browse files
Naresh MalladiGerrit - the friendly Code Review server
authored andcommitted
drivers: soc: qcom: rpm_stats: Add mutex lock for shared data
The buffer allocated in rpmstats_show need to be protected as there can be a possiblity of use-after-free scenario. Process A B | | open | | | read started | | close Add mutex lock to protect the buffer to avoid this. Also allow reading RPM stats information using sysfs nodes. The stats are available at /sys/power/system_sleep/stats Change-Id: I28ab98e264fc4e425f23c71ddc6dcc8f275d8f6b Signed-off-by: Naresh Malladi <[email protected]>
1 parent 40a7548 commit 5c51588

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

drivers/soc/qcom/rpm_stats.c

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -389,22 +389,26 @@ static ssize_t rpmstats_show(struct kobject *kobj,
389389
{
390390
struct msm_rpmstats_private_data *prvdata = NULL;
391391
struct msm_rpmstats_platform_data *pdata = NULL;
392+
ssize_t ret;
392393

394+
mutex_lock(&rpm_stats_mutex);
393395
pdata = GET_PDATA_OF_ATTR(attr);
394396

395397
prvdata =
396398
kmalloc(sizeof(*prvdata), GFP_KERNEL);
397-
if (!prvdata)
398-
return -ENOMEM;
399+
if (!prvdata) {
400+
ret = -ENOMEM;
401+
goto kmalloc_fail;
402+
}
399403

400404
prvdata->reg_base = ioremap_nocache(pdata->phys_addr_base,
401405
pdata->phys_size);
402406
if (!prvdata->reg_base) {
403-
kfree(prvdata);
404407
pr_err("%s: ERROR could not ioremap start=%pa, len=%u\n",
405408
__func__, &pdata->phys_addr_base,
406409
pdata->phys_size);
407-
return -EBUSY;
410+
ret = -EBUSY;
411+
goto ioremap_fail;
408412
}
409413

410414
prvdata->read_idx = prvdata->num_records = prvdata->len = 0;
@@ -426,23 +430,22 @@ static ssize_t rpmstats_show(struct kobject *kobj,
426430
prvdata);
427431
}
428432

429-
return snprintf(buf, prvdata->len, prvdata->buf);
433+
ret = snprintf(buf, prvdata->len, prvdata->buf);
434+
iounmap(prvdata->reg_base);
435+
ioremap_fail:
436+
kfree(prvdata);
437+
kmalloc_fail:
438+
mutex_unlock(&rpm_stats_mutex);
439+
return ret;
430440
}
431441

432442
static int msm_rpmstats_create_sysfs(struct msm_rpmstats_platform_data *pd)
433443
{
434-
struct kobject *module_kobj = NULL;
435444
struct kobject *rpmstats_kobj = NULL;
436445
struct msm_rpmstats_kobj_attr *rpms_ka = NULL;
437446
int ret = 0;
438447

439-
module_kobj = kset_find_obj(module_kset, KBUILD_MODNAME);
440-
if (!module_kobj) {
441-
pr_err("%s: Cannot find module_kset\n", __func__);
442-
return -ENODEV;
443-
}
444-
445-
rpmstats_kobj = kobject_create_and_add("rpmstats", module_kobj);
448+
rpmstats_kobj = kobject_create_and_add("system_sleep", power_kobj);
446449
if (!rpmstats_kobj) {
447450
pr_err("%s: Cannot create rpmstats kobject\n", __func__);
448451
ret = -ENOMEM;

0 commit comments

Comments
 (0)