| From: Badari Pulavarty <badari.pulavarty@intel.com> |
| Subject: mm/damon/dbgfs: avoid duplicate context directory creation |
| Date: Sun, 21 Aug 2022 18:08:53 +0000 |
| |
| When user tries to create a DAMON context via the DAMON debugfs interface |
| with a name of an already existing context, the context directory creation |
| fails but a new context is created and added in the internal data |
| structure, due to absence of the directory creation success check. As a |
| result, memory could leak and DAMON cannot be turned on. An example test |
| case is as below: |
| |
| # cd /sys/kernel/debug/damon/ |
| # echo "off" > monitor_on |
| # echo paddr > target_ids |
| # echo "abc" > mk_context |
| # echo "abc" > mk_context |
| # echo $$ > abc/target_ids |
| # echo "on" > monitor_on <<< fails |
| |
| Return value of 'debugfs_create_dir()' is expected to be ignored in |
| general, but this is an exceptional case as DAMON feature is depending |
| on the debugfs functionality and it has the potential duplicate name |
| issue. This commit therefore fixes the issue by checking the directory |
| creation failure and immediately return the error in the case. |
| |
| Link: https://lkml.kernel.org/r/20220821180853.2400-1-sj@kernel.org |
| Fixes: 75c1c2b53c78 ("mm/damon/dbgfs: support multiple contexts") |
| Signed-off-by: Badari Pulavarty <badari.pulavarty@intel.com> |
| Signed-off-by: SeongJae Park <sj@kernel.org> |
| Cc: <stable@vger.kernel.org> [ 5.15.x] |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/damon/dbgfs.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/mm/damon/dbgfs.c~mm-damon-dbgfs-avoid-duplicate-context-directory-creation |
| +++ a/mm/damon/dbgfs.c |
| @@ -818,6 +818,9 @@ static int dbgfs_mk_context(char *name) |
| return -ENOENT; |
| |
| new_dir = debugfs_create_dir(name, root); |
| + /* Below check is required for a potential duplicated name case */ |
| + if (IS_ERR(new_dir)) |
| + return PTR_ERR(new_dir); |
| dbgfs_dirs[dbgfs_nr_ctxs] = new_dir; |
| |
| new_ctx = dbgfs_new_ctx(); |
| _ |