damon_test_commit_target_regions_for() traverses expected values array
after damon_commit_target_regions() call.  It assumes
damon_commit_target_regions() made expected number of regions.  It might
not.  Because the traversal is made based on the region count, it could
do out of bounds access to the expectation value array.

The consequent user impact (out-of-bound access) is quite bad.  The
realistic user impact would be limited, though.  It would affect only
test run setups.

Fix it by testing if the number of regions was also changed as expected
and exit early for the failure.

The issue was discovered [1] by Sashiko.

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

Fixes: 603f67eb91e0 ("mm/damon/tests/core-kunit: add 
damon_commit_target_regions() test")
Cc: <[email protected]> # 6.19.x
Signed-off-by: SJ Park <[email protected]>
---
 mm/damon/tests/core-kunit.h | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
index fbf986aee2dea..4a536d41cdb2d 100644
--- a/mm/damon/tests/core-kunit.h
+++ b/mm/damon/tests/core-kunit.h
@@ -1277,14 +1277,19 @@ static void damon_test_commit_target_regions_for(struct 
kunit *test,
                kunit_skip(test, "src target setup fail");
        }
        damon_commit_target_regions(dst_target, src_target, 1);
+
+       KUNIT_EXPECT_EQ(test, damon_nr_regions(dst_target), nr_expect_regions);
+       if (damon_nr_regions(dst_target) != nr_expect_regions)
+               goto out;
+
        i = 0;
        damon_for_each_region(r, dst_target) {
                KUNIT_EXPECT_EQ(test, r->ar.start, expect_start_end[i][0]);
                KUNIT_EXPECT_EQ(test, r->ar.end, expect_start_end[i][1]);
                i++;
        }
-       KUNIT_EXPECT_EQ(test, damon_nr_regions(dst_target), nr_expect_regions);
-       KUNIT_EXPECT_EQ(test, i, nr_expect_regions);
+
+out:
        damon_free_target(dst_target);
        damon_free_target(src_target);
 }
-- 
2.47.3

Reply via email to