When running the KUnit tests with memory debugging enabled, a bunch of
use-after-free errors are hit. Fix them by using the appropriate alloc
manager in the appropriate position.

v2: Fix wb & MST issues by re-ordering the allocs instead (apparently
kmemleak lies about not leaking objects in UML KUNIT runs!?).

Signed-off-by: John Harrison <[email protected]>
CC: Alex Hung <[email protected]>
CC: Harry Wentland <[email protected]>
---
 .../amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c | 2 +-
 .../amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c | 7 +++++--
 .../drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c    | 7 ++++---
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git 
a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
index 5fdf8ce023b9..aa72934e1fea 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
@@ -9702,7 +9702,7 @@ dm_test_conn_init_ctx_alloc(struct kunit *test, enum 
signal_type signal)
        ctx->adev->mode_info.num_crtc = 1;
        dm_test_create_mode_props(test, ctx->adev);
 
-       pdev = kunit_kzalloc(test, sizeof(*pdev), GFP_KERNEL);
+       pdev = drmm_kzalloc(ctx->drm, sizeof(*pdev), GFP_KERNEL);
        KUNIT_ASSERT_NOT_NULL(test, pdev);
        device_initialize(&pdev->dev);
        pdev->dev.parent = dev;
diff --git 
a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c
index eafa3e6733a6..5a848dd5cd0f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c
@@ -3808,6 +3808,11 @@ dm_mst_test_alloc_dsc_link_ctx(struct kunit *test, int 
total_avail_slots)
        KUNIT_ASSERT_EQ(test,
                        kunit_add_action_or_reset(test, 
dm_mst_test_dsc_link_drop_locks, ctx), 0);
 
+       /* Must be allocatd prior to drm_kunit_helper_atomic_state_alloc to 
prevent
+        * use-after-free on cleanup */
+       port = kunit_kzalloc(test, sizeof(*port), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, port);
+
        ctx->state = drm_kunit_helper_atomic_state_alloc(test, ctx->drm, 
&ctx->acquire_ctx);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx->state);
 
@@ -3833,11 +3838,9 @@ dm_mst_test_alloc_dsc_link_ctx(struct kunit *test, int 
total_avail_slots)
        link_srv = kunit_kzalloc(test, sizeof(*link_srv), GFP_KERNEL);
        res_pool = kunit_kzalloc(test, sizeof(*res_pool), GFP_KERNEL);
        sink = kunit_kzalloc(test, sizeof(*sink), GFP_KERNEL);
-       port = kunit_kzalloc(test, sizeof(*port), GFP_KERNEL);
        KUNIT_ASSERT_NOT_NULL(test, link_srv);
        KUNIT_ASSERT_NOT_NULL(test, res_pool);
        KUNIT_ASSERT_NOT_NULL(test, sink);
-       KUNIT_ASSERT_NOT_NULL(test, port);
 
        link_srv->mst_decide_link_encoding_format = 
dm_mst_test_mst_encoding_format;
 
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
index 4bc033fdfa97..047ac88cb2a9 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
@@ -486,6 +486,10 @@ static void dm_test_wb_connector_init_success(struct kunit 
*test)
        struct dc *dc;
        int ret;
 
+       /* Must be allocated before adev to prevent use-after-free on cleanup */
+       wbcon = kunit_kzalloc(test, sizeof(*wbcon), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, wbcon);
+
        adev = dm_kunit_alloc_adev(test);
        adev->mode_info.num_crtc = 1;
        dm = &adev->dm;
@@ -500,9 +504,6 @@ static void dm_test_wb_connector_init_success(struct kunit 
*test)
        dc->links[0] = link;
        dm->dc = dc;
 
-       wbcon = kunit_kzalloc(test, sizeof(*wbcon), GFP_KERNEL);
-       KUNIT_ASSERT_NOT_NULL(test, wbcon);
-
        ret = amdgpu_dm_wb_connector_init(dm, wbcon, 0);
 
        KUNIT_EXPECT_EQ(test, ret, 0);
-- 
2.43.0

Reply via email to