iwlwifi: Replace zero-length array with flexible-array
PATCH 1/1 iwlwifi: Replace zero-length array with flexible-array
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99:
struct foo {
int stuff;
struct boo array[];
};By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last in the structure, which will help us prevent some kind of undefined behavior bugs from being inadvertently introduced[3] to the codebase from now on.
Also, notice that, dynamic memory allocations won't be affected by this change:
"Flexible array members have incomplete type, and so the sizeof operator may not be applied. As a quirk of the original implementation of zero-length arrays, sizeof evaluates to zero."[1]
sizeof(flexible-array-member) triggers a warning because flexible array members have incomplete type[1]. There are some instances of code in which the sizeof operator is being incorrectly/erroneously applied to zero-length arrays and the result is zero. Such instances may be hiding some bugs. So, this work (flexible-array member conversions) will also help to get completely rid of those sorts of issues.
This issue was found with the help of Coccinelle.
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")
--- drivers/net/wireless/intel/iwlwifi/dvm/commands.h | 12 ++++++------ drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h | 4 ++-- drivers/net/wireless/intel/iwlwifi/fw/debugfs.c | 2 +- drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h | 2 +- drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-)
drivers/net/wireless/intel/iwlwifi/dvm/commands.h +6 -6
@@ -1023,7 +1023,7 @@ struct iwl_wep_cmd {u8 global_key_type;u8 flags;u8 reserved; -struct iwl_wep_key key[0 ]; +struct iwl_wep_key key[]; } __packed;#define WEP_KEY_WEP_TYPE 1
@@ -1305,7 +1305,7 @@ struct iwl_tx_cmd {* length is 26 or 30 bytes, followed by payload data */ u8 payload[0 ]; -struct ieee80211_hdr hdr[0 ]; +struct ieee80211_hdr hdr[]; } __packed;/*
@@ -2380,7 +2380,7 @@ struct iwl_scan_cmd {* for one scan to complete (i.e. receive SCAN_COMPLETE_NOTIFICATION) * before requesting another scan. */ -u8 data[0 ]; +u8 data[]; } __packed;/* Can abort will notify by complete notification with abort status. */
@@ -2475,7 +2475,7 @@ struct iwl_tx_beacon_cmd {__le16 tim_idx;u8 tim_size;u8 reserved1; -struct ieee80211_hdr frame[0 ];/* beacon frame */ +struct ieee80211_hdr frame[];/* beacon frame */ } __packed;/******************************************************************************
@@ -3188,7 +3188,7 @@ struct iwl_calib_hdr {struct iwl_calib_cmd {struct iwl_calib_hdr hdr; -u8 data[0 ]; +u8 data[]; } __packed;struct iwl_calib_xtal_freq_cmd {
@@ -3216,7 +3216,7 @@ struct iwl_calib_temperature_offset_v2_cmd {/* IWL_PHY_CALIBRATE_CHAIN_NOISE_RESET_CMD */ struct iwl_calib_chain_noise_reset_cmd {struct iwl_calib_hdr hdr; -u8 data[0 ]; +u8 data[]; };/* IWL_PHY_CALIBRATE_CHAIN_NOISE_GAIN_CMD */
drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h +2 -2
@@ -351,7 +351,7 @@ struct iwl_mcc_update_resp_v3 {__le16 time;__le16 geo_info;__le32 n_channels; -__le32 channels[0 ]; +__le32 channels[]; } __packed;/* LAR_UPDATE_MCC_CMD_RESP_S_VER_3 */ /**
@@ -380,7 +380,7 @@ struct iwl_mcc_update_resp {u8 source_id;u8 reserved[3 ];__le32 n_channels; -__le32 channels[0 ]; +__le32 channels[]; } __packed;/* LAR_UPDATE_MCC_CMD_RESP_S_VER_4 */ /**
drivers/net/wireless/intel/iwlwifi/fw/debugfs.c +1 -1
@@ -261,7 +261,7 @@ struct hcmd_write_data {__be32 cmd_id;__be32 flags;__be16 length; -u8 data[0 ]; +u8 data[]; } __packed; static ssize_t iwl_dbgfs_send_hcmd_write(struct iwl_fw_runtime *fwrt, char *buf,
drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h +1 -1
@@ -175,7 +175,7 @@ void iwl_opmode_deregister(const char *name);struct iwl_op_mode {const struct iwl_op_mode_ops *ops; -char op_mode_specific[0 ]__aligned(sizeof(void *)) ; +char op_mode_specific[]__aligned(sizeof(void *)) ; };static inline void iwl_op_mode_stop (struct iwl_op_mode *op_mode)
drivers/net/wireless/intel/iwlwifi/iwl-trans.h +1 -1
@@ -878,7 +878,7 @@ struct iwl_trans {/* pointer to trans specific struct */ /*Ensure that this pointer will always be aligned to sizeof pointer */ -char trans_specific[0 ]__aligned(sizeof(void *)) ; +char trans_specific[]__aligned(sizeof(void *)) ; };const char *iwl_get_cmd_string (struct iwl_trans *trans,u32 id);
Hi all,
Friendly ping: who can take this?
Thanks
--
Gustavo
Quoted 164 lines · Gustavo A. R. Silva
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99:
struct foo { int stuff; struct boo array[]; };By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last in the structure, which will help us prevent some kind of undefined behavior bugs from being inadvertently introduced[3] to the codebase from now on.
Also, notice that, dynamic memory allocations won't be affected by this change:
"Flexible array members have incomplete type, and so the sizeof operator may not be applied. As a quirk of the original implementation of zero-length arrays, sizeof evaluates to zero."[1]
sizeof(flexible-array-member) triggers a warning because flexible array members have incomplete type[1]. There are some instances of code in which the sizeof operator is being incorrectly/erroneously applied to zero-length arrays and the result is zero. Such instances may be hiding some bugs. So, this work (flexible-array member conversions) will also help to get completely rid of those sorts of issues.
This issue was found with the help of Coccinelle.
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit76497732932f("cxgb3/l2t: Fix undefined behaviour")Signed-off-by Gustavo A. R. Silva <[email protected]>--- drivers/net/wireless/intel/iwlwifi/dvm/commands.h | 12 ++++++------ drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h | 4 ++-- drivers/net/wireless/intel/iwlwifi/fw/debugfs.c | 2 +- drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h | 2 +- drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-)drivers/net/wireless/intel/iwlwifi/dvm/commands.h +6
-6@@ -1023,7 +1023,7 @@ struct iwl_wep_cmd {u8 global_key_type;u8 flags;u8 reserved; -struct iwl_wep_key key[0 ]; +struct iwl_wep_key key[]; } __packed;#define WEP_KEY_WEP_TYPE 1@@ -1305,7 +1305,7 @@ struct iwl_tx_cmd {* length is 26 or 30 bytes, followed by payload data */ u8 payload[0 ]; -struct ieee80211_hdr hdr[0 ]; +struct ieee80211_hdr hdr[]; } __packed;/* @@ -2380,7 +2380,7 @@ struct iwl_scan_cmd {* for one scan to complete (i.e. receive SCAN_COMPLETE_NOTIFICATION) * before requesting another scan. */ -u8 data[0 ]; +u8 data[]; } __packed;/* Can abort will notify by complete notification with abort status. */ @@ -2475,7 +2475,7 @@ struct iwl_tx_beacon_cmd {__le16 tim_idx;u8 tim_size;u8 reserved1; -struct ieee80211_hdr frame[0 ];/* beacon frame */ +struct ieee80211_hdr frame[];/* beacon frame */ } __packed;/****************************************************************************** @@ -3188,7 +3188,7 @@ struct iwl_calib_hdr {struct iwl_calib_cmd {struct iwl_calib_hdr hdr; -u8 data[0 ]; +u8 data[]; } __packed;struct iwl_calib_xtal_freq_cmd {@@ -3216,7 +3216,7 @@ struct iwl_calib_temperature_offset_v2_cmd {/* IWL_PHY_CALIBRATE_CHAIN_NOISE_RESET_CMD */ struct iwl_calib_chain_noise_reset_cmd {struct iwl_calib_hdr hdr; -u8 data[0 ]; +u8 data[]; };/* IWL_PHY_CALIBRATE_CHAIN_NOISE_GAIN_CMD */ drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h +2
-2@@ -351,7 +351,7 @@ struct iwl_mcc_update_resp_v3 {__le16 time;__le16 geo_info;__le32 n_channels; -__le32 channels[0 ]; +__le32 channels[]; } __packed;/* LAR_UPDATE_MCC_CMD_RESP_S_VER_3 */ /** @@ -380,7 +380,7 @@ struct iwl_mcc_update_resp {u8 source_id;u8 reserved[3 ];__le32 n_channels; -__le32 channels[0 ]; +__le32 channels[]; } __packed;/* LAR_UPDATE_MCC_CMD_RESP_S_VER_4 */ /** drivers/net/wireless/intel/iwlwifi/fw/debugfs.c +1
-1@@ -261,7 +261,7 @@ struct hcmd_write_data {__be32 cmd_id;__be32 flags;__be16 length; -u8 data[0 ]; +u8 data[]; } __packed; static ssize_t iwl_dbgfs_send_hcmd_write(struct iwl_fw_runtime *fwrt, char *buf,drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h +1
-1@@ -175,7 +175,7 @@ void iwl_opmode_deregister(const char *name);struct iwl_op_mode {const struct iwl_op_mode_ops *ops; -char op_mode_specific[0 ]__aligned(sizeof(void *)) ; +char op_mode_specific[]__aligned(sizeof(void *)) ; };static inline void iwl_op_mode_stop (struct iwl_op_mode *op_mode)drivers/net/wireless/intel/iwlwifi/iwl-trans.h +1
-1@@ -878,7 +878,7 @@ struct iwl_trans {/* pointer to trans specific struct */ /*Ensure that this pointer will always be aligned to sizeof pointer */ -char trans_specific[0 ]__aligned(sizeof(void *)) ; +char trans_specific[]__aligned(sizeof(void *)) ; };const char *iwl_get_cmd_string (struct iwl_trans *trans,u32 id);
Quoted 29 lines · Gustavo A. R. Silva
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99:
struct foo { int stuff; struct boo array[]; };By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last in the structure, which will help us prevent some kind of undefined behavior bugs from being inadvertently introduced[3] to the codebase from now on.
Also, notice that, dynamic memory allocations won't be affected by this change:
"Flexible array members have incomplete type, and so the sizeof operator may not be applied. As a quirk of the original implementation of zero-length arrays, sizeof evaluates to zero."[1]
sizeof(flexible-array-member) triggers a warning because flexible array members have incomplete type[1]. There are some instances of code in which the sizeof operator is being incorrectly/erroneously applied to zero-length arrays and the result is zero. Such instances may be hiding some bugs. So, this work (flexible-array member conversions) will also help to get completely rid of those sorts of issues.
Quoted 7 lines
This issue was found with the help of Coccinelle.
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit76497732932f("cxgb3/l2t: Fix undefined behaviour")Signed-off-by Gustavo A. R. Silva <[email protected]>
Patch applied to iwlwifi-next.git, thanks.
45c21a0e5ba4 iwlwifi: Replace zero-length array with flexible-array