mac80211: fix divide by zero when NOA update

commit 519ee6918b upstream.

In case of one shot NOA the interval can be 0, catch that
instead of potentially (depending on the driver) crashing
like this:

divide error: 0000 [#1] SMP
[...]
Call Trace:
<IRQ>
[<ffffffffc08e891c>] ieee80211_extend_absent_time+0x6c/0xb0 [mac80211]
[<ffffffffc08e8a17>] ieee80211_update_p2p_noa+0xb7/0xe0 [mac80211]
[<ffffffffc069cc30>] ath9k_p2p_ps_timer+0x170/0x190 [ath9k]
[<ffffffffc070adf8>] ath_gen_timer_isr+0xc8/0xf0 [ath9k_hw]
[<ffffffffc0691156>] ath9k_tasklet+0x296/0x2f0 [ath9k]
[<ffffffff8107ad65>] tasklet_action+0xe5/0xf0
[...]

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Janusz.Dziedzic@tieto.com
2015-10-27 08:35:11 +01:00
committed by Greg Kroah-Hartman
parent db96a3cfca
commit 901b9f4511

View File

@@ -2951,6 +2951,13 @@ ieee80211_extend_noa_desc(struct ieee80211_noa_data *data, u32 tsf, int i)
if (end > 0) if (end > 0)
return false; return false;
/* One shot NOA */
if (data->count[i] == 1)
return false;
if (data->desc[i].interval == 0)
return false;
/* End time is in the past, check for repetitions */ /* End time is in the past, check for repetitions */
skip = DIV_ROUND_UP(-end, data->desc[i].interval); skip = DIV_ROUND_UP(-end, data->desc[i].interval);
if (data->count[i] < 255) { if (data->count[i] < 255) {