[PATCH] wifi: ath12k: fix reusing outside iterator in ath12k_wow_vif_set_wakeups()
Jeff Johnson
quic_jjohnson at quicinc.com
Mon Jul 22 16:55:32 PDT 2024
On 7/21/2024 8:33 PM, Baochen Qiang wrote:
> Smatch throws below warning:
>
> drivers/net/wireless/ath/ath12k/wow.c:434 ath12k_wow_vif_set_wakeups()
> warn: reusing outside iterator: 'i'
>
> drivers/net/wireless/ath/ath12k/wow.c
> 411 default:
> 412 break;
> 413 }
> 414
> 415 for (i = 0; i < wowlan->n_patterns; i++) {
> ^^^^^^^^^^^^^^^^^^^^^^
> Here we loop until ->n_patterns
>
> 416 const struct cfg80211_pkt_pattern *eth_pattern = &patterns[i];
> 417 struct ath12k_pkt_pattern new_pattern = {};
> 418
> 419 if (WARN_ON(eth_pattern->pattern_len > WOW_MAX_PATTERN_SIZE))
> 420 return -EINVAL;
> 421
> 422 if (ar->ab->wow.wmi_conf_rx_decap_mode ==
> 423 ATH12K_HW_TXRX_NATIVE_WIFI) {
> 424 ath12k_wow_convert_8023_to_80211(ar, eth_pattern,
> 425 &new_pattern);
> 426
> 427 if (WARN_ON(new_pattern.pattern_len > WOW_MAX_PATTERN_SIZE))
> 428 return -EINVAL;
> 429 } else {
> 430 memcpy(new_pattern.pattern, eth_pattern->pattern,
> 431 eth_pattern->pattern_len);
> 432
> 433 /* convert bitmask to bytemask */
> --> 434 for (i = 0; i < eth_pattern->pattern_len; i++)
> 435 if (eth_pattern->mask[i / 8] & BIT(i % 8))
> 436 new_pattern.bytemask[i] = 0xff;
>
> This loop re-uses i and the loop ends with i == eth_pattern->pattern_len.
> This looks like a bug.
>
> Change to use a new iterator 'j' for the inner loop to fix it.
>
> Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4
>
> Fixes: 4a3c212eee0e ("wifi: ath12k: add basic WoW functionalities")
> Reported-by: Dan Carpenter <dan.carpenter at linaro.org>
> Closes: https://lore.kernel.org/all/d4975b95-9c43-45af-a0ab-80253f18c7f2@stanley.mountain/
> Signed-off-by: Baochen Qiang <quic_bqiang at quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
More information about the ath12k
mailing list