• Dmitry Antipov's avatar
    wifi: mac80211: fix UBSAN noise in ieee80211_prep_hw_scan() · 92ecbb3a
    Dmitry Antipov authored
    When testing the previous patch with CONFIG_UBSAN_BOUNDS, I've
    noticed the following:
    
    UBSAN: array-index-out-of-bounds in net/mac80211/scan.c:372:4
    index 0 is out of range for type 'struct ieee80211_channel *[]'
    CPU: 0 PID: 1435 Comm: wpa_supplicant Not tainted 6.9.0+ #1
    Hardware name: LENOVO 20UN005QRT/20UN005QRT <...BIOS details...>
    Call Trace:
     <TASK>
     dump_stack_lvl+0x2d/0x90
     __ubsan_handle_out_of_bounds+0xe7/0x140
     ? timerqueue_add+0x98/0xb0
     ieee80211_prep_hw_scan+0x2db/0x480 [mac80211]
     ? __kmalloc+0xe1/0x470
     __ieee80211_start_scan+0x541/0x760 [mac80211]
     rdev_scan+0x1f/0xe0 [cfg80211]
     nl80211_trigger_scan+0x9b6/0xae0 [cfg80211]
     ...<the rest is not too useful...>
    
    Since '__ieee80211_start_scan()' leaves 'hw_scan_req->req.n_channels'
    uninitialized, actual boundaries of 'hw_scan_req->req.channels' can't
    be checked in 'ieee80211_prep_hw_scan()'. Although an initialization
    of 'hw_scan_req->req.n_channels' introduces some confusion around
    allocated vs. used VLA members, this shouldn't be a problem since
    everything is correctly adjusted soon in 'ieee80211_prep_hw_scan()'.
    
    Cleanup 'kmalloc()' math in '__ieee80211_start_scan()' by using the
    convenient 'struct_size()' as well.
    Signed-off-by: default avatarDmitry Antipov <dmantipov@yandex.ru>
    Link: https://msgid.link/20240517153332.18271-2-dmantipov@yandex.ru
    [improve (imho) indentation a bit]
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    92ecbb3a
scan.c 39.1 KB