* [PATCH] drm/amd/display: Don't free devres-owned i2c adapter on init failure
@ 2026-11-10 7:02 yaolu
2026-11-10 7:17 ` sashiko-bot
2026-11-11 2:19 ` [PATCH v2] drm/amd/display: Fix dm i2c adapter lifetime on teardown yaolu
0 siblings, 2 replies; 4+ messages in thread
From: yaolu @ 2026-11-10 7:02 UTC (permalink / raw)
To: harry.wentland, sunpeng.li, alexander.deucher, christian.koenig
Cc: siqueira, amd-gfx, dri-devel, linux-kernel, Lu Yao
From: Lu Yao <yaolu@kylinos.cn>
amdgpu_dm_connector_init() registers the i2c adapter with
devm_i2c_add_adapter().It will be released by devres on teardown, so
we don't need to free it when failed.
Fixes: 5b3eca05cfb0 ("drm/amd/display: Use devm_i2c_add_adapter to simplify i2c cleanup logic")
Signed-off-by: Lu Yao <yaolu@kylinos.cn>
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
index b498fc5fbb14..ccbda54c3add 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
@@ -3514,7 +3514,7 @@ int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
if (res) {
drm_err(adev_to_drm(dm->adev), "connector_init failed\n");
aconnector->connector_id = -1;
- goto out_free;
+ return res;
}
drm_connector_helper_add(
--
2.25.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] drm/amd/display: Don't free devres-owned i2c adapter on init failure
2026-11-10 7:02 [PATCH] drm/amd/display: Don't free devres-owned i2c adapter on init failure yaolu
@ 2026-11-10 7:17 ` sashiko-bot
2026-11-11 2:19 ` [PATCH v2] drm/amd/display: Fix dm i2c adapter lifetime on teardown yaolu
1 sibling, 0 replies; 4+ messages in thread
From: sashiko-bot @ 2026-11-10 7:17 UTC (permalink / raw)
To: yaolu; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] drm/amd/display: leak and dangling ddc_service in
amdgpu_dm_connector_init()
--
commit cd13d71ccba1fac1ae6d56da56c40ca922c6fa4a
Author: Lu Yao <yaolu@kylinos.cn>
drm/amd/display: Don't free devres-owned i2c adapter on init failure
This commit changes amdgpu_dm_connector_init() to return directly instead of
jumping to out_free when drm_connector_init_with_ddc() fails.
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> index b498fc5fbb140..ccbda54c3add8 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> @@ -3514,7 +3514,7 @@ int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
> if (res) {
> drm_err(adev_to_drm(dm->adev), "connector_init failed\n");
> aconnector->connector_id = -1;
> - goto out_free;
> + return res;
> }
[Severity: Medium]
Does returning here leak the struct amdgpu_i2c_adapter and leave the adapter
registered with a freed i2c->ddc_service during error unwind?
amdgpu_dm_create_i2c() allocates i2c with kzalloc_obj(), while
devm_i2c_add_adapter() only schedules i2c_del_adapter(&i2c->base) via devres
and never frees the enclosing struct amdgpu_i2c_adapter. When
amdgpu_dm_connector_init() fails, amdgpu_dm_initialize_drm_device() frees
aconnector and loses the only pointer to i2c.
In addition, amdgpu_dm_init() calls amdgpu_dm_fini() -> dc_destroy(), which
frees link->ddc (i2c->ddc_service) before dm_hw_init() reaches
devres_release_group() to unregister &i2c->base. Unregistering the adapter
and freeing i2c (or allocating i2c with devm_kzalloc() and releasing the
devres group before dc_destroy()) would avoid both the leak and the dangling
ddc_service window.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261110070204.307887-1-yaolu@kylinos.cn?part=1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2] drm/amd/display: Fix dm i2c adapter lifetime on teardown
2026-11-10 7:02 [PATCH] drm/amd/display: Don't free devres-owned i2c adapter on init failure yaolu
2026-11-10 7:17 ` sashiko-bot
@ 2026-11-11 2:19 ` yaolu
2026-11-11 3:02 ` sashiko-bot
1 sibling, 1 reply; 4+ messages in thread
From: yaolu @ 2026-11-11 2:19 UTC (permalink / raw)
To: harry.wentland, sunpeng.li, alexander.deucher, christian.koenig
Cc: siqueira, amd-gfx, dri-devel, linux-kernel, Lu Yao
From: Lu Yao <yaolu@kylinos.cn>
devm_i2c_add_adapter() only calls i2c_del_adapter() on teardown, so
struct amdgpu_i2c_adapter is never freed. Since
commit 5b3eca05cfb0 ("drm/amd/display: Use devm_i2c_add_adapter to simplify i2c cleanup logic")
every dm i2c adapter leaks on unload.
The connector_init error path cannot kfree() it either: the adapter is
still registered, so devres release would causing UAF.
On the init failure path dc_destroy() also frees i2c->ddc_service before
dm_hw_init() releases the devres group, so there also may causing UAF.
Allocate the adapter with devm_kzalloc_obj() and release the devres group
in amdgpu_dm_fini() right before dc_destroy().
Fixes: 5b3eca05cfb0 ("drm/amd/display: Use devm_i2c_add_adapter to simplify i2c cleanup logic")
Signed-off-by: Lu Yao <yaolu@kylinos.cn>
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 15 ++++++---------
.../amd/display/amdgpu_dm/amdgpu_dm_connector.c | 13 ++++---------
2 files changed, 10 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 0ea45ab12119..5dbc00e6ee63 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -961,6 +961,11 @@ static void amdgpu_dm_fini(struct amdgpu_device *adev)
amdgpu_dm_irq_fini(adev);
+ if (adev->dm.i2c_devres_group) {
+ devres_release_group(adev->dev, adev->dm.i2c_devres_group);
+ adev->dm.i2c_devres_group = NULL;
+ }
+
/* DC Destroy TODO: Replace destroy DAL */
if (adev->dm.dc)
dc_destroy(&adev->dm.dc);
@@ -1364,7 +1369,6 @@ STATIC_IFN_KUNIT int dm_oem_i2c_hw_init(struct amdgpu_device *adev)
r = devm_i2c_add_adapter(adev->dev, &oem_i2c->base);
if (r) {
drm_info(adev_to_drm(adev), "Failed to register oem i2c\n");
- kfree(oem_i2c);
return r;
}
dm->oem_i2c = oem_i2c;
@@ -1406,7 +1410,7 @@ static int dm_hw_init(struct amdgpu_ip_block *ip_block)
/* Create DAL display manager */
r = amdgpu_dm_init(adev);
if (r)
- goto err_release_i2c;
+ return r;
amdgpu_dm_hpd_init(adev);
r = dm_oem_i2c_hw_init(adev);
@@ -1415,10 +1419,6 @@ static int dm_hw_init(struct amdgpu_ip_block *ip_block)
devres_close_group(adev->dev, adev->dm.i2c_devres_group);
return 0;
-
-err_release_i2c:
- devres_release_group(adev->dev, adev->dm.i2c_devres_group);
- return r;
}
/**
@@ -1433,9 +1433,6 @@ static int dm_hw_fini(struct amdgpu_ip_block *ip_block)
{
struct amdgpu_device *adev = ip_block->adev;
- if (adev->dm.i2c_devres_group)
- devres_release_group(adev->dev, adev->dm.i2c_devres_group);
-
amdgpu_dm_hpd_fini(adev);
amdgpu_dm_fini(adev);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
index b498fc5fbb14..2e262f8ffc5f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
@@ -3427,7 +3427,7 @@ amdgpu_dm_create_i2c(struct ddc_service *ddc_service, bool oem)
struct amdgpu_device *adev = ddc_service->ctx->driver_context;
struct amdgpu_i2c_adapter *i2c;
- i2c = kzalloc_obj(struct amdgpu_i2c_adapter);
+ i2c = devm_kzalloc_obj(adev->dev, struct amdgpu_i2c_adapter);
if (!i2c)
return NULL;
i2c->base.owner = THIS_MODULE;
@@ -3499,7 +3499,7 @@ int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
if (res) {
drm_err(adev_to_drm(dm->adev), "Failed to register hw i2c %d\n", link->link_index);
- goto out_free;
+ return res;
}
connector_type = to_drm_connector_type(link->connector_signal, link->link_id.id);
@@ -3514,7 +3514,7 @@ int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
if (res) {
drm_err(adev_to_drm(dm->adev), "connector_init failed\n");
aconnector->connector_id = -1;
- goto out_free;
+ return res;
}
drm_connector_helper_add(
@@ -3538,12 +3538,7 @@ int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
if (dc_is_dp_signal(link->connector_signal))
amdgpu_dm_initialize_dp_connector(dm, aconnector, link->link_index);
-out_free:
- if (res) {
- kfree(i2c);
- aconnector->i2c = NULL;
- }
- return res;
+ return 0;
}
EXPORT_IF_KUNIT(amdgpu_dm_connector_init);
--
2.25.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2] drm/amd/display: Fix dm i2c adapter lifetime on teardown
2026-11-11 2:19 ` [PATCH v2] drm/amd/display: Fix dm i2c adapter lifetime on teardown yaolu
@ 2026-11-11 3:02 ` sashiko-bot
0 siblings, 0 replies; 4+ messages in thread
From: sashiko-bot @ 2026-11-11 3:02 UTC (permalink / raw)
To: yaolu; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] drm/amd/display: NULL deref and bad kfree() in
amdgpu_dm_create_i2c() tests
--
commit 34d2cc7ca5025a414952478c53098d172f5f6cc4
Author: Lu Yao <yaolu@kylinos.cn>
drm/amd/display: Fix dm i2c adapter lifetime on teardown
This commit allocates struct amdgpu_i2c_adapter with devm_kzalloc_obj()
and moves the release of dm.i2c_devres_group into amdgpu_dm_fini() before
dc_destroy().
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> index 8db7956c01d32..ae99058dafba4 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> @@ -3437,7 +3437,7 @@ amdgpu_dm_create_i2c(struct ddc_service *ddc_service, bool oem)
> struct amdgpu_device *adev = ddc_service->ctx->driver_context;
> struct amdgpu_i2c_adapter *i2c;
>
> - i2c = kzalloc_obj(struct amdgpu_i2c_adapter);
> + i2c = devm_kzalloc_obj(adev->dev, struct amdgpu_i2c_adapter);
[Severity: Medium]
Does switching amdgpu_dm_create_i2c() to devm_kzalloc_obj() break the
dm_test_create_i2c_oem() and dm_test_create_i2c_hw_bus() KUnit tests in
drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c?
dm_test_create_i2c_setup() leaves ctx->adev->dev as NULL, so
devm_kzalloc_obj(adev->dev, ...) triggers a NULL pointer dereference in
devres_node_add() when locking dev->devres_lock. Both tests also call
raw kfree(i2c) on the returned pointer, which is no longer valid for a
devres-managed allocation.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261111021925.63610-1-yaolu@kylinos.cn?part=1
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-11-11 3:02 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-10 7:02 [PATCH] drm/amd/display: Don't free devres-owned i2c adapter on init failure yaolu
2026-11-10 7:17 ` sashiko-bot
2026-11-11 2:19 ` [PATCH v2] drm/amd/display: Fix dm i2c adapter lifetime on teardown yaolu
2026-11-11 3:02 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox