Minsuk Kang <linuxlovemin@xxxxxxxxxxxx> writes: > Fix an array-index-out-of-bounds read in ath9k_htc_txstatus(). The bug > occurs when txs->cnt, data from a URB provided by a USB device, is > bigger than the size of the array txs->txstatus, which is > HTC_MAX_TX_STATUS. WARN_ON() already checks it, but there is no bug > handling code after the check. Make the function return if that is the > case. > > Found by a modified version of syzkaller. > > UBSAN: array-index-out-of-bounds in htc_drv_txrx.c > index 13 is out of range for type '__wmi_event_txstatus [12]' > Call Trace: > ath9k_htc_txstatus > ath9k_wmi_event_tasklet > tasklet_action_common > __do_softirq > irq_exit_rxu > sysvec_apic_timer_interrupt > > Signed-off-by: Minsuk Kang <linuxlovemin@xxxxxxxxxxxx> > --- > drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c > index 800177021baf..c628332f2562 100644 > --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c > +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c > @@ -652,9 +652,10 @@ void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event) > struct ath9k_htc_tx_event *tx_pend; > int i; > > - for (i = 0; i < txs->cnt; i++) { > - WARN_ON(txs->cnt > HTC_MAX_TX_STATUS); > + if (WARN_ON(txs->cnt > HTC_MAX_TX_STATUS)) > + return; Since this is something that can be triggered by a device sending bad data, this shouldn't be an unbounded WARN_ON(). We could turn it into a WARN_ON_ONCE(), or just get rid of it entirely... -Toke