* [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-at-end warnings
@ 2025-04-05 18:07 Gustavo A. R. Silva
2025-04-07 20:15 ` Kees Cook
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Gustavo A. R. Silva @ 2025-04-05 18:07 UTC (permalink / raw)
To: Miri Korenblit, Johannes Berg
Cc: linux-wireless, linux-kernel, Gustavo A. R. Silva,
linux-hardening
-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 <gustavoars@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;
+ /* 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);
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);
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-at-end warnings
2025-04-05 18:07 [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-at-end warnings Gustavo A. R. Silva
@ 2025-04-07 20:15 ` Kees Cook
2025-04-07 20:34 ` Johannes Berg
2025-04-25 21:19 ` Gustavo A. R. Silva
2025-05-13 16:38 ` Korenblit, Miriam Rachel
2 siblings, 1 reply; 5+ messages in thread
From: Kees Cook @ 2025-04-07 20:15 UTC (permalink / raw)
To: Gustavo A. R. Silva
Cc: Miri Korenblit, Johannes Berg, linux-wireless, linux-kernel,
linux-hardening
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 <gustavoars@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 <kees@kernel.org>
--
Kees Cook
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-at-end warnings
2025-04-07 20:15 ` Kees Cook
@ 2025-04-07 20:34 ` Johannes Berg
0 siblings, 0 replies; 5+ messages in thread
From: Johannes Berg @ 2025-04-07 20:34 UTC (permalink / raw)
To: Kees Cook, Gustavo A. R. Silva
Cc: Miri Korenblit, linux-wireless, linux-kernel, linux-hardening
On Mon, 2025-04-07 at 13:15 -0700, Kees Cook wrote:
> lots of quotes
It'd be really good if you could trim the quotes a bit ...
> > + 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?
No no no. I'm still burned by you adding this to various places
elsewhere in the wireless stack, let's not.
Btw, Gustavo, I think it was probably the other iwlwifi patch, but
please also make sure kernel-doc doesn't start complaining, we are
trying keep it that way.
johannes
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-at-end warnings
2025-04-05 18:07 [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-at-end warnings Gustavo A. R. Silva
2025-04-07 20:15 ` Kees Cook
@ 2025-04-25 21:19 ` Gustavo A. R. Silva
2025-05-13 16:38 ` Korenblit, Miriam Rachel
2 siblings, 0 replies; 5+ messages in thread
From: Gustavo A. R. Silva @ 2025-04-25 21:19 UTC (permalink / raw)
To: Gustavo A. R. Silva, Miri Korenblit, Johannes Berg
Cc: linux-wireless, linux-kernel, linux-hardening
Hi all,
Friendly ping: who can take this, please? :)
Thanks!
-Gustavo
On 05/04/25 12:07, 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 <gustavoars@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;
> + /* 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);
> 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);
^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-at-end warnings
2025-04-05 18:07 [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-at-end warnings Gustavo A. R. Silva
2025-04-07 20:15 ` Kees Cook
2025-04-25 21:19 ` Gustavo A. R. Silva
@ 2025-05-13 16:38 ` Korenblit, Miriam Rachel
2 siblings, 0 replies; 5+ messages in thread
From: Korenblit, Miriam Rachel @ 2025-05-13 16:38 UTC (permalink / raw)
To: Gustavo A. R. Silva, Berg, Johannes
Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-hardening@vger.kernel.org
> -----Original Message-----
> From: Gustavo A. R. Silva <gustavoars@kernel.org>
> Sent: Saturday, 5 April 2025 21:07
> To: Korenblit, Miriam Rachel <miriam.rachel.korenblit@intel.com>; Berg,
> Johannes <johannes.berg@intel.com>
> Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; Gustavo A. R.
> Silva <gustavoars@kernel.org>; linux-hardening@vger.kernel.org
> Subject: [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-
> at-end warnings
>
> -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 <gustavoars@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;
> + /* 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);
> 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);
> --
> 2.43.0
Acked-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-05-13 16:38 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-05 18:07 [PATCH][next] wifi: iwlwifi: mvm: d3: Avoid -Wflex-array-member-not-at-end warnings Gustavo A. R. Silva
2025-04-07 20:15 ` Kees Cook
2025-04-07 20:34 ` Johannes Berg
2025-04-25 21:19 ` Gustavo A. R. Silva
2025-05-13 16:38 ` Korenblit, Miriam Rachel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).