Skip to content
  • Michal Kazior's avatar
    cfg80211: ignore netif running state when changing iftype · 6cbfb1bb
    Michal Kazior authored
    It was possible for mac80211 to be coerced into an
    unexpected flow causing sdata union to become
    corrupted. Station pointer was put into
    sdata->u.vlan.sta memory location while it was
    really master AP's sdata->u.ap.next_beacon. This
    led to station entry being later freed as
    next_beacon before __sta_info_flush() in
    ieee80211_stop_ap() and a subsequent invalid
    pointer dereference crash.
    
    The problem was that ieee80211_ptr->use_4addr
    wasn't cleared on interface type changes.
    
    This could be reproduced with the following steps:
    
     # host A and host B have just booted; no
     # wpa_s/hostapd running; all vifs are down
     host A> iw wlan0 set type station
     host A> iw wlan0 set 4addr on
     host A> printf 'interface=wlan0\nssid=4addrcrash\nchannel=1\nwds_sta=1' > /tmp/hconf
     host A> hostapd -B /tmp/conf
     host B> iw wlan0 set 4addr on
     host B> ifconfig wlan0 up
     host B> iw wlan0 connect -w hostAssid
     host A> pkill hostapd
     # host A crashed:
    
     [  127.928192] BUG: unable to handle kernel NULL pointer dereference at 00000000000006c8
     [  127.929014] IP: [<ffffffff816f4f32>] __sta_info_flush+0xac/0x158
     ...
     [  127.934578]  [<ffffffff8170789e>] ieee80211_stop_ap+0x139/0x26c
     [  127.934578]  [<ffffffff8100498f>] ? dump_trace+0x279/0x28a
     [  127.934578]  [<ffffffff816dc661>] __cfg80211_stop_ap+0x84/0x191
     [  127.934578]  [<ffffffff816dc7ad>] cfg80211_stop_ap+0x3f/0x58
     [  127.934578]  [<ffffffff816c5ad6>] nl80211_stop_ap+0x1b/0x1d
     [  127.934578]  [<ffffffff815e53f8>] genl_family_rcv_msg+0x259/0x2b5
    
    Note: This isn't a revert of f8cdddb8
    ("cfg80211: check iface combinations only when
    iface is running") as far as functionality is
    considered because b6a55015 ("cfg80211/mac80211:
    move more combination checks to mac80211") moved
    the logic somewhere else already.
    
    Fixes: f8cdddb8
    
     ("cfg80211: check iface combinations only when iface is running")
    Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    6cbfb1bb