ath11k: fix memory OOB access in qmi_decode
The decoded_size is wrongly assigned in ath11k_qmi_msg_handlers and it results in out of boundary access in qmi_decode. The correct decoded_size should be calculated from the related ind_msg structure. This issue is exposed with QCA6390 because it needs 11 small memory chunks which are stored in qmi_wlanfw_request_mem_ind_msg_v01 and hence the decoded_size exceeds the wrongly assigend decoded_size. Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1 Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.1.0.1-01238-QCAHKSWPL_SILICONZ-2 Signed-off-by: Carl Huang <cjhuang@codeaurora.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org> Link: https://lore.kernel.org/r/1597389030-13887-9-git-send-email-kvalo@codeaurora.org
This commit is contained in:
@@ -2477,21 +2477,21 @@ static const struct qmi_msg_handler ath11k_qmi_msg_handlers[] = {
|
|||||||
.type = QMI_INDICATION,
|
.type = QMI_INDICATION,
|
||||||
.msg_id = QMI_WLFW_REQUEST_MEM_IND_V01,
|
.msg_id = QMI_WLFW_REQUEST_MEM_IND_V01,
|
||||||
.ei = qmi_wlanfw_request_mem_ind_msg_v01_ei,
|
.ei = qmi_wlanfw_request_mem_ind_msg_v01_ei,
|
||||||
.decoded_size = sizeof(qmi_wlanfw_request_mem_ind_msg_v01_ei),
|
.decoded_size = sizeof(struct qmi_wlanfw_request_mem_ind_msg_v01),
|
||||||
.fn = ath11k_qmi_msg_mem_request_cb,
|
.fn = ath11k_qmi_msg_mem_request_cb,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.type = QMI_INDICATION,
|
.type = QMI_INDICATION,
|
||||||
.msg_id = QMI_WLFW_FW_MEM_READY_IND_V01,
|
.msg_id = QMI_WLFW_FW_MEM_READY_IND_V01,
|
||||||
.ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei,
|
.ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei,
|
||||||
.decoded_size = sizeof(qmi_wlanfw_mem_ready_ind_msg_v01_ei),
|
.decoded_size = sizeof(struct qmi_wlanfw_fw_mem_ready_ind_msg_v01),
|
||||||
.fn = ath11k_qmi_msg_mem_ready_cb,
|
.fn = ath11k_qmi_msg_mem_ready_cb,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.type = QMI_INDICATION,
|
.type = QMI_INDICATION,
|
||||||
.msg_id = QMI_WLFW_FW_READY_IND_V01,
|
.msg_id = QMI_WLFW_FW_READY_IND_V01,
|
||||||
.ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei,
|
.ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei,
|
||||||
.decoded_size = sizeof(qmi_wlanfw_fw_ready_ind_msg_v01_ei),
|
.decoded_size = sizeof(struct qmi_wlanfw_fw_ready_ind_msg_v01),
|
||||||
.fn = ath11k_qmi_msg_fw_ready_cb,
|
.fn = ath11k_qmi_msg_fw_ready_cb,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2499,7 +2499,7 @@ static const struct qmi_msg_handler ath11k_qmi_msg_handlers[] = {
|
|||||||
.msg_id = QMI_WLFW_COLD_BOOT_CAL_DONE_IND_V01,
|
.msg_id = QMI_WLFW_COLD_BOOT_CAL_DONE_IND_V01,
|
||||||
.ei = qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei,
|
.ei = qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei,
|
||||||
.decoded_size =
|
.decoded_size =
|
||||||
sizeof(qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei),
|
sizeof(struct qmi_wlanfw_fw_cold_cal_done_ind_msg_v01),
|
||||||
.fn = ath11k_qmi_msg_cold_boot_cal_done_cb,
|
.fn = ath11k_qmi_msg_cold_boot_cal_done_cb,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -267,6 +267,14 @@ struct qmi_wlanfw_fw_mem_ready_ind_msg_v01 {
|
|||||||
char placeholder;
|
char placeholder;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct qmi_wlanfw_fw_ready_ind_msg_v01 {
|
||||||
|
char placeholder;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct qmi_wlanfw_fw_cold_cal_done_ind_msg_v01 {
|
||||||
|
char placeholder;
|
||||||
|
};
|
||||||
|
|
||||||
#define QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN 0
|
#define QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN 0
|
||||||
#define QMI_WLANFW_CAP_RESP_MSG_V01_MAX_LEN 207
|
#define QMI_WLANFW_CAP_RESP_MSG_V01_MAX_LEN 207
|
||||||
#define QMI_WLANFW_CAP_REQ_V01 0x0024
|
#define QMI_WLANFW_CAP_REQ_V01 0x0024
|
||||||
|
|||||||
Reference in New Issue
Block a user