]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/display: Check msg_id before processing transcation
authorAlex Hung <alex.hung@amd.com>
Tue, 16 Apr 2024 22:47:42 +0000 (16:47 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 2 May 2024 20:18:17 +0000 (16:18 -0400)
[WHY & HOW]
HDCP_MESSAGE_ID_INVALID (-1) is not a valid msg_id nor is it a valid
array index, and it needs checking before used.

This fixes 4 OVERRUN issues reported by Coverity.

Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/hdcp/hdcp_msg.c

index 076a829c237838d528cef48b1635f702ee2b42e1..1313a7c5d87bf076992ae892dff0b4cb15d3c537 100644 (file)
@@ -128,13 +128,21 @@ static bool hdmi_14_process_transaction(
        const uint8_t hdcp_i2c_addr_link_primary = 0x3a; /* 0x74 >> 1*/
        const uint8_t hdcp_i2c_addr_link_secondary = 0x3b; /* 0x76 >> 1*/
        struct i2c_command i2c_command;
-       uint8_t offset = hdcp_i2c_offsets[message_info->msg_id];
+       uint8_t offset;
        struct i2c_payload i2c_payloads[] = {
-               { true, 0, 1, &offset },
+               { true, 0, 1, 0 },
                /* actual hdcp payload, will be filled later, zeroed for now*/
                { 0 }
        };
 
+       if (message_info->msg_id == HDCP_MESSAGE_ID_INVALID) {
+               DC_LOG_ERROR("%s: Invalid message_info msg_id - %d\n", __func__, message_info->msg_id);
+               return false;
+       }
+
+       offset = hdcp_i2c_offsets[message_info->msg_id];
+       i2c_payloads[0].data = &offset;
+
        switch (message_info->link) {
        case HDCP_LINK_SECONDARY:
                i2c_payloads[0].address = hdcp_i2c_addr_link_secondary;
@@ -308,6 +316,11 @@ static bool dp_11_process_transaction(
        struct dc_link *link,
        struct hdcp_protection_message *message_info)
 {
+       if (message_info->msg_id == HDCP_MESSAGE_ID_INVALID) {
+               DC_LOG_ERROR("%s: Invalid message_info msg_id - %d\n", __func__, message_info->msg_id);
+               return false;
+       }
+
        return dpcd_access_helper(
                link,
                message_info->length,