From 976725d769b07ef6f49311458293d94cf49f2669 Mon Sep 17 00:00:00 2001 From: S1eepy_Amon <19373368@buaa.edu.cn> Date: Sun, 8 Oct 2023 10:59:49 +0800 Subject: [PATCH] usb: dwc2: fix possible NULL pointer dereference caused by driver concurrency next inclusion from next v6.6.0-rc4 commit ef307bc6ef04e8c1ea843231db58e3afaafa9fa6 category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I862CC CVE: NA Reference:https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=ef307bc6ef04e8c1ea843231db58e3afaafa9fa6 -------------------------------- This possible bug is found by an experimental static analysis tool developed by out team. This tool analyzes the locking APIs to extract function pairs that can be concurrently executed, and then analyzes the instructions in the paired functions to identify possible concurrency bugs including data races and atomicity violations. The above possible bug is reported, when the tool analyzes the source code of Linux 6.5. When _dwc2_hcd_urb_enqueue() and _dwc2_hcd_urb_dequeue() are concurrently executed, the NULL check of "urb->hcpriv" can be executed before "urb->hcpriv = NULL". After urb->hcpriv is NULL, it can be used in the function call to dwc2_hcd_urb_dequeue(), which can cause a NULL pointer dereference. To fix this possible bug, "urb->hcpriv = NULL" should be executed with holding the lock "hsotg->lock". After using this patch, my tool never reports the possible bug, with the kernelconfiguration allyesconfig for x86_64. Because I have no associated hardware, I cannot test the patch in runtime testing, and just verify it according to the code logic. Fixes: 33ad261aa62b ("usb: dwc2: host: spinlock urb_enqueue") Signed-off-by: Jia-Ju Bai Link: https://lore.kernel.org/r/20230926024404.832096-1-baijiaju@buaa.edu.cn Signed-off-by: Greg Kroah-Hartman Signed-off-by: Zheng Haoran <19373368@buaa.edu.cn> --- drivers/usb/dwc2/hcd.c | 2 +- scripts/conmakehash | Bin 0 -> 16712 bytes scripts/pnmtologo | Bin 0 -> 21640 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100755 scripts/conmakehash create mode 100755 scripts/pnmtologo diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index 9279d3d3698c..14925fedb01a 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c @@ -4684,8 +4684,8 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, if (qh_allocated && qh->channel && qh->channel->qh == qh) qh->channel->qh = NULL; fail2: - spin_unlock_irqrestore(&hsotg->lock, flags); urb->hcpriv = NULL; + spin_unlock_irqrestore(&hsotg->lock, flags); kfree(qtd); fail1: if (qh_allocated) { diff --git a/scripts/conmakehash b/scripts/conmakehash new file mode 100755 index 0000000000000000000000000000000000000000..3fa4054a8338139b93105c7aad4518eded5c9014 GIT binary patch literal 16712 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 literal 0 HcmV?d00001 diff --git a/scripts/pnmtologo b/scripts/pnmtologo new file mode 100755 index 0000000000000000000000000000000000000000..8a79e3af4b423f75bb090f5e4d5b4dd86341e672 GIT binary patch literal 21640 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