On Sat, Apr 05, 2025 at 12:07:26PM -0600, Gustavo A. R. Silva wrote: > -Wflex-array-member-not-at-end was introduced in GCC-14, and we are > getting ready to enable it, globally. > > Use the `DEFINE_RAW_FLEX()` helper for on-stack definitions of > a flexible structure where the size of the flexible-array member > is known at compile-time, and refactor the rest of the code, > accordingly. > > So, with these changes, fix the following warnings: > > drivers/net/wireless/intel/iwlwifi/mvm/d3.c:124:52: warning: structure > containing a flexible array member is not at the end of another structure > [-Wflex-array-member-not-at-end] > drivers/net/wireless/intel/iwlwifi/mvm/d3.c:2067:51: warning: structure > containing a flexible array member is not at the end of another structure > [-Wflex-array-member-not-at-end] > drivers/net/wireless/intel/iwlwifi/mvm/d3.c:2162:43: warning: structure > containing a flexible array member is not at the end of another structure > [-Wflex-array-member-not-at-end] > drivers/net/wireless/intel/iwlwifi/mvm/d3.c:2225:43: warning: structure > containing a flexible array member is not at the end of another structure > [-Wflex-array-member-not-at-end] > > Signed-off-by: Gustavo A. R. Silva <gustavo...@kernel.org> > --- > drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 129 +++++++++----------- > 1 file changed, 61 insertions(+), 68 deletions(-) > > diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c > b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c > index 3e8b7168af01..3e95799208fc 100644 > --- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c > +++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c > @@ -120,19 +120,17 @@ static void iwl_mvm_wowlan_program_keys(struct > ieee80211_hw *hw, > switch (key->cipher) { > case WLAN_CIPHER_SUITE_WEP40: > case WLAN_CIPHER_SUITE_WEP104: { /* hack it for now */ > - struct { > - struct iwl_mvm_wep_key_cmd wep_key_cmd; > - struct iwl_mvm_wep_key wep_key; > - } __packed wkc = { > - .wep_key_cmd.mac_id_n_color = > - cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id, > - mvmvif->color)), > - .wep_key_cmd.num_keys = 1, > - /* firmware sets STA_KEY_FLG_WEP_13BYTES */ > - .wep_key_cmd.decryption_type = STA_KEY_FLG_WEP, > - .wep_key.key_index = key->keyidx, > - .wep_key.key_size = key->keylen, > - }; > + DEFINE_RAW_FLEX(struct iwl_mvm_wep_key_cmd, wkc, wep_key, 1); > + struct iwl_mvm_wep_key *wep_key = wkc->wep_key; > + > + wkc->mac_id_n_color = > + cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id, > + mvmvif->color)); > + wkc->num_keys = 1;
Looks like struct iwl_mvm_wep_key_cmd::num_keys is the counted_by for struct iwl_mvm_wep_key_cmd::wep_key? > + /* firmware sets STA_KEY_FLG_WEP_13BYTES */ > + wkc->decryption_type = STA_KEY_FLG_WEP; > + wep_key->key_index = key->keyidx; > + wep_key->key_size = key->keylen; > > /* > * This will fail -- the key functions don't set support > @@ -142,18 +140,19 @@ static void iwl_mvm_wowlan_program_keys(struct > ieee80211_hw *hw, > if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) > break; > > - memcpy(&wkc.wep_key.key[3], key->key, key->keylen); > + memcpy(&wep_key->key[3], key->key, key->keylen); > if (key->keyidx == mvmvif->tx_key_idx) { > /* TX key must be at offset 0 */ > - wkc.wep_key.key_offset = 0; > + wep_key->key_offset = 0; > } else { > /* others start at 1 */ > data->wep_key_idx++; > - wkc.wep_key.key_offset = data->wep_key_idx; > + wep_key->key_offset = data->wep_key_idx; > } > > mutex_lock(&mvm->mutex); > - ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, 0, sizeof(wkc), &wkc); > + ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, 0, > + __struct_size(wkc), wkc); > data->error = ret != 0; > > mvm->ptk_ivlen = key->iv_len; > @@ -2063,10 +2062,8 @@ static bool iwl_mvm_mlo_gtk_rekey(struct > iwl_wowlan_status_data *status, > struct iwl_wowlan_mlo_gtk *mlo_key = &status->mlo_keys[i]; > struct ieee80211_key_conf *key, *old_key; > struct ieee80211_key_seq seq; > - struct { > - struct ieee80211_key_conf conf; > - u8 key[32]; > - } conf = {}; > + DEFINE_RAW_FLEX(struct ieee80211_key_conf, conf, key, > + WOWLAN_KEY_MAX_SIZE); Okay, yes, WOWLAN_KEY_MAX_SIZE == 32. > u16 flags = le16_to_cpu(mlo_key->flags); > int j, link_id, key_id, key_type; > > @@ -2083,40 +2080,40 @@ static bool iwl_mvm_mlo_gtk_rekey(struct > iwl_wowlan_status_data *status, > key_type >= WOWLAN_MLO_GTK_KEY_NUM_TYPES)) > continue; > > - conf.conf.cipher = old_keys->cipher[link_id][key_type]; > + conf->cipher = old_keys->cipher[link_id][key_type]; > /* WARN_ON? */ > - if (!conf.conf.cipher) > + if (!conf->cipher) > continue; > > - conf.conf.keylen = 0; > - switch (conf.conf.cipher) { > + conf->keylen = 0; > + switch (conf->cipher) { > case WLAN_CIPHER_SUITE_CCMP: > case WLAN_CIPHER_SUITE_GCMP: > - conf.conf.keylen = WLAN_KEY_LEN_CCMP; > + conf->keylen = WLAN_KEY_LEN_CCMP; > break; > case WLAN_CIPHER_SUITE_GCMP_256: > - conf.conf.keylen = WLAN_KEY_LEN_GCMP_256; > + conf->keylen = WLAN_KEY_LEN_GCMP_256; > break; > case WLAN_CIPHER_SUITE_BIP_GMAC_128: > - conf.conf.keylen = WLAN_KEY_LEN_BIP_GMAC_128; > + conf->keylen = WLAN_KEY_LEN_BIP_GMAC_128; > break; > case WLAN_CIPHER_SUITE_BIP_GMAC_256: > - conf.conf.keylen = WLAN_KEY_LEN_BIP_GMAC_256; > + conf->keylen = WLAN_KEY_LEN_BIP_GMAC_256; > break; > case WLAN_CIPHER_SUITE_AES_CMAC: > - conf.conf.keylen = WLAN_KEY_LEN_AES_CMAC; > + conf->keylen = WLAN_KEY_LEN_AES_CMAC; > break; > case WLAN_CIPHER_SUITE_BIP_CMAC_256: > - conf.conf.keylen = WLAN_KEY_LEN_BIP_CMAC_256; > + conf->keylen = WLAN_KEY_LEN_BIP_CMAC_256; > break; > } > > - if (WARN_ON(!conf.conf.keylen || > - conf.conf.keylen > sizeof(conf.key))) > + if (WARN_ON(!conf->keylen || > + conf->keylen > WOWLAN_KEY_MAX_SIZE)) > continue; > > - memcpy(conf.conf.key, mlo_key->key, conf.conf.keylen); > - conf.conf.keyidx = key_id; > + memcpy(conf->key, mlo_key->key, conf->keylen); > + conf->keyidx = key_id; > > old_key = old_keys->key[link_id][key_id]; > if (old_key) { > @@ -2128,7 +2125,7 @@ static bool iwl_mvm_mlo_gtk_rekey(struct > iwl_wowlan_status_data *status, > > IWL_DEBUG_WOWLAN(mvm, "Add MLO key id %d, link id %d\n", > key_id, link_id); > - key = ieee80211_gtk_rekey_add(vif, &conf.conf, link_id); > + key = ieee80211_gtk_rekey_add(vif, conf, link_id); > if (WARN_ON(IS_ERR(key))) { > ret = false; > goto out; > @@ -2158,30 +2155,28 @@ static bool iwl_mvm_gtk_rekey(struct > iwl_wowlan_status_data *status, > { > int i, j; > struct ieee80211_key_conf *key; > - struct { > - struct ieee80211_key_conf conf; > - u8 key[32]; > - } conf = { > - .conf.cipher = gtk_cipher, > - }; > + DEFINE_RAW_FLEX(struct ieee80211_key_conf, conf, key, > + WOWLAN_KEY_MAX_SIZE); > int link_id = vif->active_links ? __ffs(vif->active_links) : -1; > > + conf->cipher = gtk_cipher; > + > BUILD_BUG_ON(WLAN_KEY_LEN_CCMP != WLAN_KEY_LEN_GCMP); > - BUILD_BUG_ON(sizeof(conf.key) < WLAN_KEY_LEN_CCMP); > - BUILD_BUG_ON(sizeof(conf.key) < WLAN_KEY_LEN_GCMP_256); > - BUILD_BUG_ON(sizeof(conf.key) < WLAN_KEY_LEN_TKIP); > - BUILD_BUG_ON(sizeof(conf.key) < sizeof(status->gtk[0].key)); > + BUILD_BUG_ON(WOWLAN_KEY_MAX_SIZE < WLAN_KEY_LEN_CCMP); > + BUILD_BUG_ON(WOWLAN_KEY_MAX_SIZE < WLAN_KEY_LEN_GCMP_256); > + BUILD_BUG_ON(WOWLAN_KEY_MAX_SIZE < WLAN_KEY_LEN_TKIP); > + BUILD_BUG_ON(WOWLAN_KEY_MAX_SIZE < sizeof(status->gtk[0].key)); > > switch (gtk_cipher) { > case WLAN_CIPHER_SUITE_CCMP: > case WLAN_CIPHER_SUITE_GCMP: > - conf.conf.keylen = WLAN_KEY_LEN_CCMP; > + conf->keylen = WLAN_KEY_LEN_CCMP; > break; > case WLAN_CIPHER_SUITE_GCMP_256: > - conf.conf.keylen = WLAN_KEY_LEN_GCMP_256; > + conf->keylen = WLAN_KEY_LEN_GCMP_256; > break; > case WLAN_CIPHER_SUITE_TKIP: > - conf.conf.keylen = WLAN_KEY_LEN_TKIP; > + conf->keylen = WLAN_KEY_LEN_TKIP; > break; > default: > WARN_ON(1); > @@ -2191,14 +2186,14 @@ static bool iwl_mvm_gtk_rekey(struct > iwl_wowlan_status_data *status, > if (!status->gtk[i].len) > continue; > > - conf.conf.keyidx = status->gtk[i].id; > + conf->keyidx = status->gtk[i].id; > IWL_DEBUG_WOWLAN(mvm, > "Received from FW GTK cipher %d, key index > %d\n", > - conf.conf.cipher, conf.conf.keyidx); > - memcpy(conf.conf.key, status->gtk[i].key, > + conf->cipher, conf->keyidx); > + memcpy(conf->key, status->gtk[i].key, > sizeof(status->gtk[i].key)); > > - key = ieee80211_gtk_rekey_add(vif, &conf.conf, link_id); > + key = ieee80211_gtk_rekey_add(vif, conf, link_id); > if (IS_ERR(key)) > return false; > > @@ -2220,42 +2215,40 @@ iwl_mvm_d3_igtk_bigtk_rekey_add(struct > iwl_wowlan_status_data *status, > struct ieee80211_vif *vif, u32 cipher, > struct iwl_multicast_key_data *key_data) > { > + DEFINE_RAW_FLEX(struct ieee80211_key_conf, conf, key, > + WOWLAN_KEY_MAX_SIZE); > struct ieee80211_key_conf *key_config; > - struct { > - struct ieee80211_key_conf conf; > - u8 key[WOWLAN_KEY_MAX_SIZE]; > - } conf = { > - .conf.cipher = cipher, > - .conf.keyidx = key_data->id, > - }; > struct ieee80211_key_seq seq; > int link_id = vif->active_links ? __ffs(vif->active_links) : -1; > > + conf->cipher = cipher; > + conf->keyidx = key_data->id; > + > if (!key_data->len) > return true; > > - iwl_mvm_d3_set_igtk_bigtk_ipn(key_data, &seq, conf.conf.cipher); > + iwl_mvm_d3_set_igtk_bigtk_ipn(key_data, &seq, conf->cipher); > > switch (cipher) { > case WLAN_CIPHER_SUITE_BIP_GMAC_128: > - conf.conf.keylen = WLAN_KEY_LEN_BIP_GMAC_128; > + conf->keylen = WLAN_KEY_LEN_BIP_GMAC_128; > break; > case WLAN_CIPHER_SUITE_BIP_GMAC_256: > - conf.conf.keylen = WLAN_KEY_LEN_BIP_GMAC_256; > + conf->keylen = WLAN_KEY_LEN_BIP_GMAC_256; > break; > case WLAN_CIPHER_SUITE_AES_CMAC: > - conf.conf.keylen = WLAN_KEY_LEN_AES_CMAC; > + conf->keylen = WLAN_KEY_LEN_AES_CMAC; > break; > case WLAN_CIPHER_SUITE_BIP_CMAC_256: > - conf.conf.keylen = WLAN_KEY_LEN_BIP_CMAC_256; > + conf->keylen = WLAN_KEY_LEN_BIP_CMAC_256; > break; > default: > WARN_ON(1); > } > - BUILD_BUG_ON(sizeof(conf.key) < sizeof(key_data->key)); > - memcpy(conf.conf.key, key_data->key, conf.conf.keylen); > + BUILD_BUG_ON(WOWLAN_KEY_MAX_SIZE < sizeof(key_data->key)); > + memcpy(conf->key, key_data->key, conf->keylen); > > - key_config = ieee80211_gtk_rekey_add(vif, &conf.conf, link_id); > + key_config = ieee80211_gtk_rekey_add(vif, conf, link_id); > if (IS_ERR(key_config)) > return false; > ieee80211_set_key_rx_seq(key_config, 0, &seq); Reviewed-by: Kees Cook <k...@kernel.org> -- Kees Cook