| From 1bcf63a44381691d6192872801f830ce3250e367 Mon Sep 17 00:00:00 2001 |
| From: Siyang Liu <Security@tencent.com> |
| Date: Fri, 4 Jul 2025 11:16:22 +0800 |
| Subject: drm/amd/display: fix a Null pointer dereference vulnerability |
| |
| From: Siyang Liu <Security@tencent.com> |
| |
| commit 1bcf63a44381691d6192872801f830ce3250e367 upstream. |
| |
| [Why] |
| A null pointer dereference vulnerability exists in the AMD display driver's |
| (DC module) cleanup function dc_destruct(). |
| When display control context (dc->ctx) construction fails |
| (due to memory allocation failure), this pointer remains NULL. |
| During subsequent error handling when dc_destruct() is called, |
| there's no NULL check before dereferencing the perf_trace member |
| (dc->ctx->perf_trace), causing a kernel null pointer dereference crash. |
| |
| [How] |
| Check if dc->ctx is non-NULL before dereferencing. |
| |
| Link: https://lore.kernel.org/r/tencent_54FF4252EDFB6533090A491A25EEF3EDBF06@qq.com |
| Co-developed-by: Mario Limonciello <mario.limonciello@amd.com> |
| Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> |
| (Updated commit text and removed unnecessary error message) |
| Signed-off-by: Siyang Liu <Security@tencent.com> |
| Signed-off-by: Roman Li <roman.li@amd.com> |
| Reviewed-by: Alex Hung <alex.hung@amd.com> |
| Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| (cherry picked from commit 9dd8e2ba268c636c240a918e0a31e6feaee19404) |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/display/dc/core/dc.c | 19 ++++++++++--------- |
| 1 file changed, 10 insertions(+), 9 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/display/dc/core/dc.c |
| +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c |
| @@ -890,17 +890,18 @@ static void dc_destruct(struct dc *dc) |
| if (dc->link_srv) |
| link_destroy_link_service(&dc->link_srv); |
| |
| - if (dc->ctx->gpio_service) |
| - dal_gpio_service_destroy(&dc->ctx->gpio_service); |
| + if (dc->ctx) { |
| + if (dc->ctx->gpio_service) |
| + dal_gpio_service_destroy(&dc->ctx->gpio_service); |
| |
| - if (dc->ctx->created_bios) |
| - dal_bios_parser_destroy(&dc->ctx->dc_bios); |
| + if (dc->ctx->created_bios) |
| + dal_bios_parser_destroy(&dc->ctx->dc_bios); |
| + kfree(dc->ctx->logger); |
| + dc_perf_trace_destroy(&dc->ctx->perf_trace); |
| |
| - kfree(dc->ctx->logger); |
| - dc_perf_trace_destroy(&dc->ctx->perf_trace); |
| - |
| - kfree(dc->ctx); |
| - dc->ctx = NULL; |
| + kfree(dc->ctx); |
| + dc->ctx = NULL; |
| + } |
| |
| kfree(dc->bw_vbios); |
| dc->bw_vbios = NULL; |