VYPR
Unrated severityNVD Advisory· Published May 28, 2026

CVE-2026-46180

CVE-2026-46180

Description

In the Linux kernel, the following vulnerability has been resolved:

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

Watchdog task might end between send_sig() and kthread_stop() calls, what results in the use-after-free issue. Fix this by increasing watchdog task reference count before calling send_sig() and dropping it by switching to kthread_stop_put().

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

A use-after-free in brcmfmac's watchdog task stop sequence could allow local privilege escalation.

Vulnerability

A use-after-free vulnerability exists in the brcmfmac WiFi driver in the Linux kernel when stopping the watchdog task. The race condition occurs between send_sig() and kthread_stop() calls; if the watchdog task ends during this window, the task structure is freed while still being accessed, leading to use-after-free. The issue affects kernel versions prior to the fix commit [1].

Exploitation

An attacker with local access and the ability to trigger the watchdog task stop sequence (e.g., by unloading the driver or through specific operations) could exploit this race condition. The attacker would need to time the operation so that the watchdog task exits between the send_sig() and kthread_stop() calls.

Impact

Successful exploitation could lead to a use-after-free condition, potentially allowing an attacker to escalate privileges or cause a denial of service (system crash). The exact impact depends on the kernel configuration and memory layout.

Mitigation

The fix is included in the Linux kernel stable tree via commit 908b92231e1d [1]. Users should update to a kernel version containing this commit. No workaround is available; applying the patch is the recommended mitigation.

AI Insight generated on May 28, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected products

2

Patches

10
c623b6358088

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitMarek SzyprowskiApr 16, 2026Fixed in 7.1-rc3via kernel-cna
2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 30f6fcb6863279..8fb595733b9c36 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 30f6fcb6863279..8fb595733b9c36 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
ed4168d1a50f

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitMarek SzyprowskiApr 16, 2026Fixed in 6.6.140via kernel-cna
2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 6b38d9de71af6e..a4d0db371c8976 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2475,8 +2475,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4557,8 +4558,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 6b38d9de71af6e..a4d0db371c8976 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2475,8 +2475,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4557,8 +4558,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
d16827cb1d39

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitMarek SzyprowskiApr 16, 2026Fixed in 6.12.88via kernel-cna
2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 7b936668c1b66d..71bb8b699731ba 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2475,8 +2475,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4557,8 +4558,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 7b936668c1b66d..71bb8b699731ba 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2475,8 +2475,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4557,8 +4558,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
908b92231e1d

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitMarek SzyprowskiApr 16, 2026Fixed in 7.0.7via kernel-cna
2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 30f6fcb6863279..8fb595733b9c36 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 30f6fcb6863279..8fb595733b9c36 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
658d2e46c2e9

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitMarek SzyprowskiApr 16, 2026Fixed in 6.18.30via kernel-cna
2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 4e6ed02c159134..a0e88dbaaebe67 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 4e6ed02c159134..a0e88dbaaebe67 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
d16827cb1d39

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 7b936668c1b66d..71bb8b699731ba 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2475,8 +2475,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4557,8 +4558,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 7b936668c1b66d..71bb8b699731ba 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2475,8 +2475,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4557,8 +4558,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
ed4168d1a50f

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 6b38d9de71af6e..a4d0db371c8976 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2475,8 +2475,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4557,8 +4558,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 6b38d9de71af6e..a4d0db371c8976 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2475,8 +2475,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4557,8 +4558,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
c623b6358088

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 30f6fcb6863279..8fb595733b9c36 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 30f6fcb6863279..8fb595733b9c36 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
658d2e46c2e9

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 4e6ed02c159134..a0e88dbaaebe67 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 4e6ed02c159134..a0e88dbaaebe67 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
908b92231e1d

wifi: brcmfmac: Fix potential use-after-free issue when stopping watchdog task

2 files changed · +8 6
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 30f6fcb6863279..8fb595733b9c36 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c+4 3 modified
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    index 30f6fcb6863279..8fb595733b9c36 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
    @@ -2476,8 +2476,9 @@ static void brcmf_sdio_bus_stop(struct device *dev)
     	brcmf_dbg(TRACE, "Enter\n");
     
     	if (bus->watchdog_tsk) {
    +		get_task_struct(bus->watchdog_tsk);
     		send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -		kthread_stop(bus->watchdog_tsk);
    +		kthread_stop_put(bus->watchdog_tsk);
     		bus->watchdog_tsk = NULL;
     	}
     
    @@ -4567,8 +4568,9 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
     	if (bus) {
     		/* Stop watchdog task */
     		if (bus->watchdog_tsk) {
    +			get_task_struct(bus->watchdog_tsk);
     			send_sig(SIGTERM, bus->watchdog_tsk, 1);
    -			kthread_stop(bus->watchdog_tsk);
    +			kthread_stop_put(bus->watchdog_tsk);
     			bus->watchdog_tsk = NULL;
     		}
     
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Missing reference count protection in the watchdog task shutdown path allows a use-after-free when the watchdog kthread exits between send_sig() and kthread_stop()."

Attack vector

An attacker capable of triggering device removal or bus stop operations on a Broadcom FullMAC SDIO wireless interface can exploit a race condition. When brcmf_sdio_bus_stop() or brcmf_sdio_remove() calls send_sig(SIGTERM) on the watchdog kthread, that kthread may exit and free its task_struct before the subsequent kthread_stop() call. This results in a use-after-free on the freed task_struct [patch_id=2897995]. The vulnerability is local, requiring the ability to trigger driver teardown (e.g., via hot-unplug or rmmod).

Affected code

The vulnerable code is in drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c, in the functions brcmf_sdio_bus_stop() (around line 2476) and brcmf_sdio_remove() (around line 4567). Both functions call send_sig(SIGTERM, bus->watchdog_tsk, 1) followed by kthread_stop(bus->watchdog_tsk) without holding an extra reference on the task_struct [patch_id=2897995].

What the fix does

The patch adds get_task_struct() before send_sig() to increment the watchdog kthread's reference count, preventing the task_struct from being freed if the thread exits early. It then replaces kthread_stop() with kthread_stop_put(), which decrements the reference count after stopping the thread [patch_id=2897995]. This ensures the task_struct remains valid throughout the entire stop sequence. The same fix is applied in both brcmf_sdio_bus_stop() and brcmf_sdio_remove() [patch_id=2897995].

Preconditions

  • configThe system must be using the brcmfmac driver with an SDIO-based Broadcom wireless device.
  • inputAn attacker must be able to trigger driver teardown (e.g., device hot-unplug, rmmod, or suspend/resume) while the watchdog kthread is active.

Generated on May 28, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.