Skip to contentSkip to conversation

mm/damon/sysfs: fix param_ctx leak on damon_sysfs_new_test_ctx() failure

PATCH Superseded Josh Law 2 participants 5 messages Mar 20 – Mar 21

Subsystems (3)
lore
Share & tools
lore

Josh Law

author
#0 lore raw

PATCH v2 1/1 mm/damon/sysfs: fix param_ctx leak on damon_sysfs_new_test_ctx() failure

When damon_sysfs_new_test_ctx() fails in damon_sysfs_commit_input(), param_ctx is leaked because the early return skips the cleanup at the out label. Destroy param_ctx before returning.

Fixes f0c5118ebb0e ("mm/damon/sysfs: catch commit test ctx alloc failure")
Cc <[email protected]> # 6.18.x
---
 mm/damon/sysfs.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
mm/damon/sysfs.c +3 -1
index 576d1ddd736b..b573b9d60784 100644
@@ -1524,8 +1524,10 @@ static int damon_sysfs_commit_input(void *data)
 	if (IS_ERR(param_ctx))
 		return PTR_ERR(param_ctx);
 	test_ctx = damon_sysfs_new_test_ctx(kdamond->damon_ctx);
-	if (!test_ctx)
+	if (!test_ctx) {
+		damon_destroy_ctx(param_ctx);
 		return -ENOMEM;
+	}
 	err = damon_commit_ctx(test_ctx, param_ctx);
 	if (err)
 		goto out;
Signature · 1 line
2.34.1
author
#1 lore raw

PATCH v2 1/1 mm/damon/sysfs: check contexts->nr before accessing contexts_arr[0]

Multiple sysfs command paths dereference contexts_arr[0] without first verifying that nr_contexts >= 1. A user can set nr_contexts to 0 via sysfs while DAMON is running, causing NULL pointer dereferences.

Guard all commands (except OFF) at the entry point of damon_sysfs_handle_cmd().

Fixes 0ac32b8affb5 ("mm/damon/sysfs: support DAMOS stats")
Cc <[email protected]> # 5.18.x
---
 mm/damon/sysfs.c | 3 +++
 1 file changed, 3 insertions(+)
mm/damon/sysfs.c +3 -0
index b573b9d60784..ddc30586c0e6 100644
@@ -1749,6 +1749,9 @@ static int damon_sysfs_update_schemes_tried_regions(
 static int damon_sysfs_handle_cmd(enum damon_sysfs_cmd cmd,
 		struct damon_sysfs_kdamond *kdamond)
 {
+	if (cmd != DAMON_SYSFS_CMD_OFF && kdamond->contexts->nr != 1)
+		return -EINVAL;
+
 	switch (cmd) {
 	case DAMON_SYSFS_CMD_ON:
 		return damon_sysfs_turn_damon_on(kdamond);
Signature · 1 line
2.34.1
author
#2 lore raw

PATCH v2 1/1 mm/damon/sysfs: check contexts->nr in repeat_call_fn

In reply to Josh Law

damon_sysfs_repeat_call_fn() calls damon_sysfs_upd_tuned_intervals(), damon_sysfs_upd_schemes_stats(), and damon_sysfs_upd_schemes_effective_quotas() without checking contexts->nr. If nr_contexts is set to 0 via sysfs while DAMON is running, these functions dereference contexts_arr[0] and cause a NULL pointer dereference. Add the missing check.

Fixes d809a7c64ba8 ("mm/damon/sysfs: implement refresh_ms file internal work")
Cc <[email protected]> # 6.17.x
---
 mm/damon/sysfs.c | 3 +++
 1 file changed, 3 insertions(+)
mm/damon/sysfs.c +3 -0
index ddc30586c0e6..6a44a2f3d8fc 100644
@@ -1620,9 +1620,12 @@ static int damon_sysfs_repeat_call_fn(void *data)
 
 	if (!mutex_trylock(&damon_sysfs_lock))
 		return 0;
+	if (sysfs_kdamond->contexts->nr != 1)
+		goto out;
 	damon_sysfs_upd_tuned_intervals(sysfs_kdamond);
 	damon_sysfs_upd_schemes_stats(sysfs_kdamond);
 	damon_sysfs_upd_schemes_effective_quotas(sysfs_kdamond);
+out:
 	mutex_unlock(&damon_sysfs_lock);
 	return 0;
 }
Signature · 1 line
2.34.1
author
#4 lore raw
Quoted 11 lines · SeongJae Park

Apparently this series is only by a mistake, and therefore a new version [1] is posted. So I will skip this series and review the new version. Let me know if anything is wrong.

[1] https://lore.kernel.org/[email protected]

Thanks,
SJ

[...]

Only the numbering was wrong, like no 1/3 2/3 etc. Im a bit of a perferctionist so i nitpicked it

V/R

Josh Law