提交 977c6ba6 编写于 作者: M Manivannan Sadhasivam 提交者: Borislav Petkov (AMD)

EDAC/qcom: Do not pass llcc_driv_data as edac_device_ctl_info's pvt_info

The memory for llcc_driv_data is allocated by the LLCC driver. But when
it is passed as the private driver info to the EDAC core, it will get freed
during the qcom_edac driver release. So when the qcom_edac driver gets probed
again, it will try to use the freed data leading to the use-after-free bug.

Hence, do not pass llcc_driv_data as pvt_info but rather reference it
using the platform_data pointer in the qcom_edac driver.

Fixes: 27450653 ("drivers: edac: Add EDAC driver support for QCOM SoCs")
Reported-by: NSteev Klimaszewski <steev@kali.org>
Signed-off-by: NManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: NBorislav Petkov (AMD) <bp@alien8.de>
Tested-by: Steev Klimaszewski <steev@kali.org> # Thinkpad X13s
Tested-by: Andrew Halaney <ahalaney@redhat.com> # sa8540p-ride
Cc: <stable@vger.kernel.org> # 4.20
Link: https://lore.kernel.org/r/20230118150904.26913-4-manivannan.sadhasivam@linaro.org
上级 cec669ff
...@@ -252,7 +252,7 @@ dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type) ...@@ -252,7 +252,7 @@ dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type)
static int static int
dump_syn_reg(struct edac_device_ctl_info *edev_ctl, int err_type, u32 bank) dump_syn_reg(struct edac_device_ctl_info *edev_ctl, int err_type, u32 bank)
{ {
struct llcc_drv_data *drv = edev_ctl->pvt_info; struct llcc_drv_data *drv = edev_ctl->dev->platform_data;
int ret; int ret;
ret = dump_syn_reg_values(drv, bank, err_type); ret = dump_syn_reg_values(drv, bank, err_type);
...@@ -289,7 +289,7 @@ static irqreturn_t ...@@ -289,7 +289,7 @@ static irqreturn_t
llcc_ecc_irq_handler(int irq, void *edev_ctl) llcc_ecc_irq_handler(int irq, void *edev_ctl)
{ {
struct edac_device_ctl_info *edac_dev_ctl = edev_ctl; struct edac_device_ctl_info *edac_dev_ctl = edev_ctl;
struct llcc_drv_data *drv = edac_dev_ctl->pvt_info; struct llcc_drv_data *drv = edac_dev_ctl->dev->platform_data;
irqreturn_t irq_rc = IRQ_NONE; irqreturn_t irq_rc = IRQ_NONE;
u32 drp_error, trp_error, i; u32 drp_error, trp_error, i;
int ret; int ret;
...@@ -358,7 +358,6 @@ static int qcom_llcc_edac_probe(struct platform_device *pdev) ...@@ -358,7 +358,6 @@ static int qcom_llcc_edac_probe(struct platform_device *pdev)
edev_ctl->dev_name = dev_name(dev); edev_ctl->dev_name = dev_name(dev);
edev_ctl->ctl_name = "llcc"; edev_ctl->ctl_name = "llcc";
edev_ctl->panic_on_ue = LLCC_ERP_PANIC_ON_UE; edev_ctl->panic_on_ue = LLCC_ERP_PANIC_ON_UE;
edev_ctl->pvt_info = llcc_driv_data;
rc = edac_device_add_device(edev_ctl); rc = edac_device_add_device(edev_ctl);
if (rc) if (rc)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册