Re: [PATCH] station: check return of handshake_state_set_pmksa

James Prestwood <[email protected]> Wed, 3 Dec 2025 14:27:06 -0800
Newsgroups dev.linux.lists.iwd
Message-ID <[email protected]>
On 12/3/25 2:19 PM, Denis Kenzior wrote:
> Hi James,
>
> On 12/3/25 9:03 AM, James Prestwood wrote:
>> If this fails num_pmkids and pmkids would get set, but to an
>> uninitialized buffer. This would then fail to build the handshake
>> object later when copying the PMKID.
>> ---
>>   src/station.c | 10 +++++++---
>>   1 file changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/station.c b/src/station.c
>> index 50997f5f..6c9e8d13 100644
>> --- a/src/station.c
>> +++ b/src/station.c
>> @@ -1378,9 +1378,13 @@ build_ie:
>>                       bss->ssid, bss->ssid_len,
>>                       info.akm_suites);
>>           if (pmksa) {
>> -            handshake_state_set_pmksa(hs, pmksa);
>> -            info.num_pmkids = 1;
>> -            info.pmkids = hs->pmksa->pmkid;
>> +            if (!handshake_state_set_pmksa(hs, pmksa)) {
>
> This seems fishy.  Are you sure you're not masking the real issue 
> here?  Would this possibly be related to fast transition re-using an 
> old handshake?  Maybe we should not try to use or set the PMKSA for FT ?

Possibly. What happens is we complete an initial association (call it 
AP1) and establish a PMKSA. Possibly unrelated but IWD did fail to FT 
due to an association rejection status=40, IWD connects again (different 
AP), and we then try to FT back to the original AP1. This is where 
handshake_state_set_pmksa() fails.

Not using PMKSA for FT is reasonable for sure, since there's not really 
a point there...

>
>> +                l_warn("failed to set PMKSA to handshake");
>> +                pmksa_cache_free(pmksa);
>> +            } else {
>> +                info.num_pmkids = 1;
>> +                info.pmkids = hs->pmksa->pmkid;
>> +            }
>>           }
>>       }
>
> Regards,
> -Denis