The branch main has been updated by adrian:

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

commit 33e8fc370c186c693c32f909305520de7c75853a
Author:     Adrian Chadd <adr...@freebsd.org>
AuthorDate: 2025-06-11 18:10:03 +0000
Commit:     Adrian Chadd <adr...@freebsd.org>
CommitDate: 2025-07-16 15:12:11 +0000

    net80211: don't dereference a NULL HTINFO IE if it's presented
    
    ieee80211_vht_get_vhtflags() is checking the htinfo IE for the
    20/40MHz flag as part of deciding valid channel widths.
    
    However, in the hostapd path, the ASSOC_REQ/REASSOC_REQ path
    will parse the IEs, do some HT/VHT setup, then call
    ieee80211_ht_updatehtcap_final().  In a HT ASSOC/REASSOC request
    there won't be a HTINFO IE, however ieee80211_vht_get_vhtflags()
    still checks for it, leading to a panic.
    
    Instead, treat it as if we don't yet know if it's HT40 or not.
    I'm not sure if we should do that or have it just do
    _RETURN_CHAN_BITS(0).
    
    Differential Revision:  https://reviews.freebsd.org/D50794
---
 sys/net80211/ieee80211_ht.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c
index 5ec80e3646b8..c28f124648a1 100644
--- a/sys/net80211/ieee80211_ht.c
+++ b/sys/net80211/ieee80211_ht.c
@@ -1951,6 +1951,11 @@ do {                                                     
                \
            (vap->iv_vht_flags & IEEE80211_FVHT_VHT) == 0)
                _RETURN_CHAN_BITS(0);
 
+       /*
+        * TODO: should we bail out if there's no htinfo?
+        * Or just treat it as if we can't do the HT20/HT40 check?
+        */
+
        /*
         * The original code was based on
         * 802.11ac-2013, Table 8-183x-VHT Operation Information subfields.
@@ -1962,8 +1967,12 @@ do {                                                     
                \
         */
 
        htinfo = (const struct ieee80211_ie_htinfo *)ni->ni_ies.htinfo_ie;
-       ht40 = ((htinfo->hi_byte1 & IEEE80211_HTINFO_TXWIDTH) ==
-           IEEE80211_HTINFO_TXWIDTH_2040);
+       if (htinfo != NULL)
+               ht40 = ((htinfo->hi_byte1 & IEEE80211_HTINFO_TXWIDTH) ==
+                   IEEE80211_HTINFO_TXWIDTH_2040);
+       else
+               ht40 = false;
+
        can_vht160 = can_vht80p80 = can_vht80 = false;
 
        /* 20 Mhz */

Reply via email to