All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Bluetooth: btintel_pcie: Fix NULL hdev dereference in debug register dump
@ 2026-10-13 23:35 Chia-Lin Kao (AceLan)
  2026-10-14  2:15 ` bluez.test.bot
  2026-10-15  3:02 ` [PATCH] " AceLan Kao
  0 siblings, 2 replies; 3+ messages in thread
From: Chia-Lin Kao (AceLan) @ 2026-10-13 23:35 UTC (permalink / raw)
  To: Marcel Holtmann, Luiz Augusto von Dentz
  Cc: Kiran K, Chandrashekar Devegowda, linux-bluetooth, linux-kernel

The MSI-X interrupts are set up in btintel_pcie_config_pcie() and the
controller is brought out of reset in btintel_pcie_enable_bt(), both
long before btintel_pcie_setup_hdev() allocates the hci_dev.  On top of
that, data->hdev is only published after hci_register_dev() succeeds.
Until then, any interrupt that reaches an error path sees a NULL
data->hdev.

btintel_pcie_dump_debug_registers() is called from those error paths
with data->hdev and dereferences it immediately via hci_get_drvdata().
If the controller raises such an interrupt during probe, the IRQ thread
oopses.  The bt_dev_*() logging helpers are fine with a NULL hdev (they
print "null" as the device name), so the crash is only in the register
dump.

This was seen on an HP ZBook X G2i (8086:e376) with v7.3-rc7, where the
GP1 mailbox interrupt was handled right after the device was enabled:

  btintel_pcie 0000:00:14.7: enabling device (0000 -> 0002)
  Bluetooth: null: Received gp1 mailbox interrupt
  Oops: general protection fault, kernel NULL pointer dereference 0xda0
  CPU: 11 UID: 0 PID: 671 Comm: irq/213-btintel
  RIP: 0010:btintel_pcie_dump_debug_registers+0x20/0x910 [btintel_pcie]
  Call Trace:
   btintel_pcie_irq_msix_handler+0x1ca/0x6b0 [btintel_pcie]
   irq_thread_fn+0x26/0x70
   irq_thread+0x1b1/0x300

The IRQ thread then dies in do_exit() and the module load and the
following power off block behind it.  The GP1 handler no longer calls
the dump helper in current linux-next, but the GP0 handler still does
for the "Controller in error state" and "Controller in lockdown state"
cases, which have the same exposure during probe.

Return early from btintel_pcie_dump_debug_registers() when there is no
hci_dev yet.  The register dump is delivered through hci_recv_diag(),
so there is nowhere to send it without an hdev anyway; the preceding
bt_dev_err() has already reported the event.

Fixes: 190377500fde ("Bluetooth: btintel_pcie: Dump debug registers on error")
Cc: stable@vger.kernel.org
Signed-off-by: Chia-Lin Kao (AceLan) <acelan.kao@canonical.com>
---
 drivers/bluetooth/btintel_pcie.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/bluetooth/btintel_pcie.c b/drivers/bluetooth/btintel_pcie.c
index 3a555aa50c87..fcdea1302cf7 100644
--- a/drivers/bluetooth/btintel_pcie.c
+++ b/drivers/bluetooth/btintel_pcie.c
@@ -433,12 +433,21 @@ static void btintel_pcie_prepare_tx(struct txq *txq, u16 tfd_index,
 
 static inline void btintel_pcie_dump_debug_registers(struct hci_dev *hdev)
 {
-	struct btintel_pcie_data *data = hci_get_drvdata(hdev);
+	struct btintel_pcie_data *data;
 	u16 cr_hia, cr_tia;
 	u32 reg, mbox_reg;
 	struct sk_buff *skb;
 	u8 buf[80];
 
+	/* The interrupts are enabled before the hci_dev is allocated and
+	 * data->hdev is published only after hci_register_dev() succeeds, so
+	 * an interrupt handler can get here with a NULL hdev.
+	 */
+	if (!hdev)
+		return;
+
+	data = hci_get_drvdata(hdev);
+
 	skb = alloc_skb(1024, GFP_ATOMIC);
 	if (!skb)
 		return;
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* RE: Bluetooth: btintel_pcie: Fix NULL hdev dereference in debug register dump
  2026-10-13 23:35 [PATCH] Bluetooth: btintel_pcie: Fix NULL hdev dereference in debug register dump Chia-Lin Kao (AceLan)
@ 2026-10-14  2:15 ` bluez.test.bot
  2026-10-15  3:02 ` [PATCH] " AceLan Kao
  1 sibling, 0 replies; 3+ messages in thread
From: bluez.test.bot @ 2026-10-14  2:15 UTC (permalink / raw)
  To: linux-bluetooth, acelan.kao

[-- Attachment #1: Type: text/plain, Size: 1019 bytes --]

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/series/1185144/

---Test result---

Test Summary:
CheckPatch                    PASS      3.05 seconds
VerifyFixes                   PASS      0.69 seconds
VerifySignedoff               PASS      0.16 seconds
GitLint                       PASS      0.51 seconds
SubjectPrefix                 PASS      0.15 seconds
BuildKernel                   PASS      31.14 seconds
CheckAllWarning               PASS      36.70 seconds
CheckSparse                   PASS      37.91 seconds
BuildKernel32                 PASS      30.88 seconds
CheckKernelLLVM               PASS      37.21 seconds
TestRunnerSetup               PASS      723.14 seconds
IncrementalBuild              PASS      28.28 seconds



https://github.com/bluez/bluetooth-next/pull/925

---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Bluetooth: btintel_pcie: Fix NULL hdev dereference in debug register dump
  2026-10-13 23:35 [PATCH] Bluetooth: btintel_pcie: Fix NULL hdev dereference in debug register dump Chia-Lin Kao (AceLan)
  2026-10-14  2:15 ` bluez.test.bot
@ 2026-10-15  3:02 ` AceLan Kao
  1 sibling, 0 replies; 3+ messages in thread
From: AceLan Kao @ 2026-10-15  3:02 UTC (permalink / raw)
  To: Marcel Holtmann, Luiz Augusto von Dentz
  Cc: Kiran K, Chandrashekar Devegowda, linux-bluetooth, linux-kernel

Chia-Lin Kao (AceLan) <acelan.kao@canonical.com> 於 2026年10月14日週三 上午7:35寫道:
>
> The MSI-X interrupts are set up in btintel_pcie_config_pcie() and the
> controller is brought out of reset in btintel_pcie_enable_bt(), both
> long before btintel_pcie_setup_hdev() allocates the hci_dev.  On top of
> that, data->hdev is only published after hci_register_dev() succeeds.
> Until then, any interrupt that reaches an error path sees a NULL
> data->hdev.
>
> btintel_pcie_dump_debug_registers() is called from those error paths
> with data->hdev and dereferences it immediately via hci_get_drvdata().
> If the controller raises such an interrupt during probe, the IRQ thread
> oopses.  The bt_dev_*() logging helpers are fine with a NULL hdev (they
> print "null" as the device name), so the crash is only in the register
> dump.
>
> This was seen on an HP ZBook X G2i (8086:e376) with v7.3-rc7, where the
> GP1 mailbox interrupt was handled right after the device was enabled:
>
>   btintel_pcie 0000:00:14.7: enabling device (0000 -> 0002)
>   Bluetooth: null: Received gp1 mailbox interrupt
>   Oops: general protection fault, kernel NULL pointer dereference 0xda0
>   CPU: 11 UID: 0 PID: 671 Comm: irq/213-btintel
>   RIP: 0010:btintel_pcie_dump_debug_registers+0x20/0x910 [btintel_pcie]
>   Call Trace:
>    btintel_pcie_irq_msix_handler+0x1ca/0x6b0 [btintel_pcie]
>    irq_thread_fn+0x26/0x70
>    irq_thread+0x1b1/0x300
>
> The IRQ thread then dies in do_exit() and the module load and the
> following power off block behind it.  The GP1 handler no longer calls
> the dump helper in current linux-next, but the GP0 handler still does
> for the "Controller in error state" and "Controller in lockdown state"
> cases, which have the same exposure during probe.
>
> Return early from btintel_pcie_dump_debug_registers() when there is no
> hci_dev yet.  The register dump is delivered through hci_recv_diag(),
> so there is nowhere to send it without an hdev anyway; the preceding
> bt_dev_err() has already reported the event.
>
> Fixes: 190377500fde ("Bluetooth: btintel_pcie: Dump debug registers on error")
> Cc: stable@vger.kernel.org
> Signed-off-by: Chia-Lin Kao (AceLan) <acelan.kao@canonical.com>
> ---
>  drivers/bluetooth/btintel_pcie.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/bluetooth/btintel_pcie.c b/drivers/bluetooth/btintel_pcie.c
> index 3a555aa50c87..fcdea1302cf7 100644
> --- a/drivers/bluetooth/btintel_pcie.c
> +++ b/drivers/bluetooth/btintel_pcie.c
> @@ -433,12 +433,21 @@ static void btintel_pcie_prepare_tx(struct txq *txq, u16 tfd_index,
>
>  static inline void btintel_pcie_dump_debug_registers(struct hci_dev *hdev)
>  {
> -       struct btintel_pcie_data *data = hci_get_drvdata(hdev);
> +       struct btintel_pcie_data *data;
>         u16 cr_hia, cr_tia;
>         u32 reg, mbox_reg;
>         struct sk_buff *skb;
>         u8 buf[80];
>
> +       /* The interrupts are enabled before the hci_dev is allocated and
> +        * data->hdev is published only after hci_register_dev() succeeds, so
> +        * an interrupt handler can get here with a NULL hdev.
> +        */
> +       if (!hdev)
> +               return;
> +
> +       data = hci_get_drvdata(hdev);
> +
>         skb = alloc_skb(1024, GFP_ATOMIC);
>         if (!skb)
>                 return;
> --
> 2.53.0
>

Sorry, this one is duplicated with
https://lore.kernel.org/lkml/20261013125241.1230408-1-an.wu@canonical.com/
Please ignore this one, and continue with the one ChunAn submitted.

-- 
Chia-Lin Kao(AceLan)
http://blog.acelan.idv.tw/
E-Mail: acelan.kaoATcanonical.com (s/AT/@/)

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-10-15  3:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-13 23:35 [PATCH] Bluetooth: btintel_pcie: Fix NULL hdev dereference in debug register dump Chia-Lin Kao (AceLan)
2026-10-14  2:15 ` bluez.test.bot
2026-10-15  3:02 ` [PATCH] " AceLan Kao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.