Re: [PATCH] brcmfmac: Fix NULL pointer dereference in P2P action frame handling
Richard Reigh <[email protected]> Mon, 6 Oct 2025 13:37:36 -0500
| Newsgroups | dev.linux.lists.brcm80211,org.kernel.vger.linux-wireless |
|---|---|
| Message-ID | <CAFwtOaU3tDrKhwdAGi=C0-YJiZJzatBQiRRjsLQSiGC_4CUWPw@mail.gmail.com> |
On Mon, Oct 6, 2025 at 12:28 PM Stefan Wahren <[email protected]> wrote: > > Am 06.10.25 um 19:08 schrieb Richard Reigh: > > On Mon, Oct 6, 2025 at 10:47 AM Stefan Wahren <[email protected]> wrote: > >> Hi Richard, > >> > >> Am 04.10.25 um 11:22 schrieb Arend van Spriel: > >>> On 10/3/2025 7:02 PM, Stefan Wahren wrote: > >>>> Hi, > >>>> > >>>> Am 03.10.25 um 18:00 schrieb Arend van Spriel: > >>>>> Op 3 oktober 2025 01:20:21 schreef Richard Reigh <[email protected]>: > >>>>> > >>>>>> When iPhones query network information via the WiFi settings "i" > >>>>>> button, > >>>>>> the brcmfmac driver crashes with a NULL pointer dereference. This > >>>>>> occurs > >>>>>> because the P2P device vif is not initialized when handling certain > >>>>>> action > >>>>>> frames. > >>>>> That does make a lot more sense than the line that gdb gave me with > >>>>> my driver rebuild attempt. > >>>>> > >>>>>> Add NULL check for vif before dereferencing in > >>>>>> brcmf_p2p_tx_action_frame() > >>>>>> and return -ENODEV when vif is NULL. Also modify > >>>>> Now I don't think it is necessary to bail out here. See my > >>>>> suggestion below... > >>>>> > >>>>>> the retry loop in > >>>>>> brcmf_p2p_send_action_frame() to stop immediately on permanent > >>>>>> failures > >>>>>> rather than retrying. > >>>>>> > >>>>>> Tested on Raspberry Pi Zero 2 W with kernel 6.1.21-v8+ > >>>>>> > >>>>>> Signed-off-by: Richard Reigh <[email protected]> > >>>>>> --- > >>>>>> .../wireless/broadcom/brcm80211/brcmfmac/p2p.c | 16 +++++++++++++++- > >>>>>> 1 file changed, 15 insertions(+), 1 deletion(-) > >>>>>> > >>>>>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c > >>>>>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c > >>>>>> index 10d9d9c63..2c73156fa 100644 > >>>>>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c > >>>>>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c > >>>>>> @@ -1559,6 +1559,12 @@ static s32 brcmf_p2p_tx_action_frame(struct > >>>>>> brcmf_p2p_info *p2p, > >>>>>> else > >>>>>> vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif; > >>>>>> > >>>>>> + /* add NULL check */ > >>>>>> + if (!vif) { > >>>>>> + brcmf_err("vif is NULL, cannot send action frame\n"); > >>>>>> + return -ENODEV; > >>>>>> + } > >>>>> Instead of giving up and surrender we can use primary vif, ie. p2p- > >>>>>> bss_idx[P2PAPI_BSSCFG_PRIMARY].vif: > >>>>> if (!vif) { > >>>>> brcmf_dbg(TRACE, "no P2P device setup\n"); > >>>>> vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif; > >>>>> } > >>>> this looks much better. But the whole patch needs a fixes tag. > >>> Sure. > >>> > >>>> In case this issue is reproducible before Linux 5.8, the tag should > >>>> reference: > >>>> 18e2f61db3b7 ("brcmfmac: P2P action frame tx.") > >>>> > >>>> otherwise it should reference: > >>>> d524d5ce3655 ("brcmfmac: p2p cert 6.1.9-support GOUT handling p2p > >>>> presence request") > >>> Both good suggestions. Looking at the code I would say that > >>> 18e2f61db3b7 ("brcmfmac: P2P action frame tx.") is the best choice. > >> thanks. @Richard Do you plan to submit a V2 patch? > >> > >> Best regards > >>> Regards, > >>> Arend > > Stefan, > > > > Yes, I plan on submitting a V2 patch, after I finish testing the change. > > > > I will also add the suggested fixes tag to the patch submission. > Sure, take your time. > > Thanks > > > > Thanks, > > Richard Hi Arend and Stefan, Thank you for the feedback on V1. I've tested the suggested fallback to PRIMARY vif, but unfortunately it still crashes with a NULL pointer dereference. The PRIMARY vif itself is not NULL (confirmed via debug output), but using it for P2P action frames causes a crash later in brcmf_p2p_tx_action_frame(). It appears the PRIMARY vif may not have the necessary P2P-specific structures initialized. Should I: 1. Investigate which specific pointer/structure is NULL when using PRIMARY vif for P2P operations, or 2. Stick with the original approach of failing gracefully with -ENODEV when DEVICE vif is unavailable? My original fix (returning -ENODEV) does prevent the crash and allows the system to continue operating normally, just without responding to that particular iPhone query. Best regards, Richard