Commit 9541b308 authored by Manivannan Sadhasivam's avatar Manivannan Sadhasivam Committed by Yu Kuai
Browse files

scsi: ufs: qcom: Only free platform MSIs when ESI is enabled

mainline inclusion
from mainline-v6.13-rc2
commit 64506b3d23a337e98a74b18dcb10c8619365f2bd
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IBEANX
CVE: CVE-2024-56620

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=64506b3d23a337e98a74b18dcb10c8619365f2bd



--------------------------------

Otherwise, it will result in a NULL pointer dereference as below:

Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008
Call trace:
 mutex_lock+0xc/0x54
 platform_device_msi_free_irqs_all+0x14/0x20
 ufs_qcom_remove+0x34/0x48 [ufs_qcom]
 platform_remove+0x28/0x44
 device_remove+0x4c/0x80
 device_release_driver_internal+0xd8/0x178
 driver_detach+0x50/0x9c
 bus_remove_driver+0x6c/0xbc
 driver_unregister+0x30/0x60
 platform_driver_unregister+0x14/0x20
 ufs_qcom_pltform_exit+0x18/0xb94 [ufs_qcom]
 __arm64_sys_delete_module+0x180/0x260
 invoke_syscall+0x44/0x100
 el0_svc_common.constprop.0+0xc0/0xe0
 do_el0_svc+0x1c/0x28
 el0_svc+0x34/0xdc
 el0t_64_sync_handler+0xc0/0xc4
 el0t_64_sync+0x190/0x194

Cc: stable@vger.kernel.org # 6.3
Fixes: 519b6274 ("scsi: ufs: qcom: Add MCQ ESI config vendor specific ops")
Signed-off-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://lore.kernel.org/r/20241111-ufs_bug_fix-v1-2-45ad8b62f02e@linaro.org


Reviewed-by: default avatarBean Huo <beanhuo@micron.com>
Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Conflicts:
	drivers/ufs/host/ufs-qcom.c
[commit 0842b7617e34 ("scsi: ufs: Convert all platform drivers to
returnvoid") is not backported]
Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
parent 5672a2cb
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -1923,9 +1923,11 @@ static int ufs_qcom_probe(struct platform_device *pdev)
static int ufs_qcom_remove(struct platform_device *pdev)
{
	struct ufs_hba *hba =  platform_get_drvdata(pdev);
	struct ufs_qcom_host *host = ufshcd_get_variant(hba);

	pm_runtime_get_sync(&(pdev)->dev);
	ufshcd_remove(hba);
	if (host->esi_enabled)
		platform_msi_domain_free_irqs(hba->dev);
	return 0;
}