wifi: rtw89: fw: validate multi-firmware header before getting its size
authorPing-Ke Shih <pkshih@realtek.com>
Mon, 3 Feb 2025 07:29:11 +0000 (15:29 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 10 Feb 2025 03:02:03 +0000 (11:02 +0800)
To access firmware elements appended after multi-firmware, add its size
as offset to get start address of firmware elements.

         +-----+-------+------+---------+--------------+ --
         | sig | fw_nr | rsvd | version | reserved     |   \
         +---------------------------------------------+   |
 fw 0    | cv | type | mp | rsvd | shift | size | rsvd |   |
         +---------------------------------------------+   |
 fw 1    | cv | type | mp | rsvd | shift | size | rsvd |   |
         +---------------------------------------------+   |
 fw N-1  |                  ...                        |   |
         +=============================================+   | mfw size
         |               fw 0 content                  |   |
         +=============================================+   |
         |               fw 1 content                  |   |
         +=============================================+   |
         |                  ...                        |   |
         +=============================================+   |
         |               fw N -1 content               |   |
         +=============================================+ --/
         |             fw element TLV X                |
         +=============================================+
         |             fw element TLV Y                |
         +=============================================+
         |             fw element TLV Z                |
         +=============================================+

To avoid Coverity warning when getting mfw size, validate it header ahead.

Addresses-Coverity-ID: 1544385 ("Untrusted array index read")

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250203072911.47313-5-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/fw.c

index 68e80e54ab5fa91a153d9dee84587fb21c3743ae..35b86970db2a4583c40b1ec8e38be803531e2f37 100644 (file)
@@ -586,12 +586,17 @@ static u32 rtw89_mfw_get_size(struct rtw89_dev *rtwdev)
                (const struct rtw89_mfw_hdr *)firmware->data;
        const struct rtw89_mfw_info *mfw_info;
        u32 size;
+       int ret;
 
        if (mfw_hdr->sig != RTW89_MFW_SIG) {
                rtw89_warn(rtwdev, "not mfw format\n");
                return 0;
        }
 
+       ret = rtw89_mfw_validate_hdr(rtwdev, firmware, mfw_hdr);
+       if (ret)
+               return ret;
+
        mfw_info = &mfw_hdr->info[mfw_hdr->fw_nr - 1];
        size = le32_to_cpu(mfw_info->shift) + le32_to_cpu(mfw_info->size);