From: Harry Wentland <[email protected]>

[Why&How]
dc_process_dmub_aux_transfer_async() copies payload->length bytes into a
16-byte stack buffer (dpaux.data[16]) guarded only by an ASSERT(), which
is a no-op in release builds. If a caller ever passes length > 16 this
results in a stack buffer overflow via memcpy.

Additionally, link_index is used to dereference dc->links[] without
bounds checking against dc->link_count, risking an out-of-bounds access.

Replace the ASSERT with a hard runtime check that returns false when
payload->length exceeds the destination buffer size, and add a bounds
check for link_index before it is used.

Cc: [email protected]

Assisted-by: GitHub Copilot:Claude claude-4-opus

Reviewed-by: Alex Hung <[email protected]>
Signed-off-by: Harry Wentland <[email protected]>
Signed-off-by: Ivan Lipski <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 48d32adb9eb3..0f37209c8330 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -6615,7 +6615,11 @@ bool dc_process_dmub_aux_transfer_async(struct dc *dc,
        uint8_t action;
        union dmub_rb_cmd cmd = {0};
 
-       ASSERT(payload->length <= 16);
+       if (link_index >= dc->link_count || !dc->links[link_index])
+               return false;
+
+       if (payload->length > sizeof(cmd.dp_aux_access.aux_control.dpaux.data))
+               return false;
 
        cmd.dp_aux_access.header.type = DMUB_CMD__DP_AUX_ACCESS;
        cmd.dp_aux_access.header.payload_bytes = 0;
-- 
2.43.0

Reply via email to