• Michal Kazior's avatar
    cfg80211: ignore netif running state when changing iftype · e5ad0e7d
    Michal Kazior authored
    commit 6cbfb1bb upstream.
    
    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>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    e5ad0e7d
util.c 37.6 KB