git: cb3849930362 - main - x86/intr: Handle case of disabling MSI after release

From: Justin Hibbits <jhibbits_at_FreeBSD.org>
Date: Mon, 27 Oct 2025 14:34:33 UTC
The branch main has been updated by jhibbits:

URL: https://cgit.FreeBSD.org/src/commit/?id=cb38499303621553c977fd7dd7f18d12731fcd9c

commit cb38499303621553c977fd7dd7f18d12731fcd9c
Author:     Justin Hibbits <jhibbits@FreeBSD.org>
AuthorDate: 2025-10-26 02:45:26 +0000
Commit:     Justin Hibbits <jhibbits@FreeBSD.org>
CommitDate: 2025-10-27 14:33:49 +0000

    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
---
 sys/x86/x86/msi.c | 8 ++++++++
 1 file changed, 8 insertions(+)

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++)