diff options
| author | Justin Hibbits <jhibbits@FreeBSD.org> | 2025-10-26 02:45:26 +0000 |
|---|---|---|
| committer | Justin Hibbits <jhibbits@FreeBSD.org> | 2025-10-27 14:33:49 +0000 |
| commit | cb38499303621553c977fd7dd7f18d12731fcd9c (patch) | |
| tree | e88162636653e0222f455c740bec13f99a5cba8c | |
| parent | 1a679fb907962843f01b103ec672136a8f8d8edb (diff) | |
x86/intr: Handle case of disabling MSI after release
Once an interrupt source is registered it's never deregistered.
However, when an MSI is released the pointer for it becomes NULLed out,
resulting in a NULL pointer dereference when attempting to disable the
now-released MSI source. Add NULL check to avoid this.
Reviewed by: kib
Sponsored by: Juniper Networks, Inc.
Differential Revision: https://reviews.freebsd.org/D51624
| -rw-r--r-- | sys/x86/x86/msi.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/x86/x86/msi.c b/sys/x86/x86/msi.c index 9d5a51f9753c..b38247bf6e45 100644 --- a/sys/x86/x86/msi.c +++ b/sys/x86/x86/msi.c @@ -219,6 +219,14 @@ msi_disable_intr(struct intsrc *isrc) struct msi_intsrc *msi = (struct msi_intsrc *)isrc; msi = msi->msi_first; + + /* + * Interrupt sources are always registered, but never unregistered. + * Handle the case where MSIs have all been unregistered. + */ + if (msi == NULL) + return; + msi->msi_enabled--; if (msi->msi_enabled == 0) { for (u_int i = 0; i < msi->msi_count; i++) |
