[bug report] wifi: ath12k: add basic WoW functionalities

Dan Carpenter dan.carpenter at linaro.org
Fri Jul 19 17:57:49 PDT 2024


Hello Baochen Qiang,

Commit 4a3c212eee0e ("wifi: ath12k: add basic WoW functionalities")
from Jun 19, 2024 (linux-next), leads to the following Smatch static
checker 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.

    437 
    438                         new_pattern.pattern_len = eth_pattern->pattern_len;
    439                         new_pattern.pkt_offset = eth_pattern->pkt_offset;
    440                 }
    441 
    442                 ret = ath12k_wmi_wow_add_pattern(ar, arvif->vdev_id,
    443                                                  pattern_id,
    444                                                  new_pattern.pattern,
    445                                                  new_pattern.bytemask,
    446                                                  new_pattern.pattern_len,
    447                                                  new_pattern.pkt_offset);
    448                 if (ret) {
    449                         ath12k_warn(ar->ab, "failed to add pattern %i to vdev %i: %d\n",
    450                                     pattern_id,
    451                                     arvif->vdev_id, ret);
    452                         return ret;
    453                 }
    454 
    455                 pattern_id++;
    456                 __set_bit(WOW_PATTERN_MATCH_EVENT, &wow_mask);
    457         }
    458 
    459         for (i = 0; i < WOW_EVENT_MAX; i++) {

regards,
dan carpenter



More information about the ath12k mailing list