Commit da60fbe7 authored by Gustavo A. R. Silva's avatar Gustavo A. R. Silva Committed by David S. Miller

NFC: Replace zero-length array with flexible-array member

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]

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 76497732 ("cxgb3/l2t: Fix undefined behaviour")
Signed-off-by: default avatarGustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6dd7f1a1
...@@ -76,7 +76,7 @@ static u8 nci_core_get_config_otp_ram_version[5] = { ...@@ -76,7 +76,7 @@ static u8 nci_core_get_config_otp_ram_version[5] = {
struct nci_core_get_config_rsp { struct nci_core_get_config_rsp {
u8 status; u8 status;
u8 count; u8 count;
u8 data[0]; u8 data[];
}; };
static int fdp_nci_create_conn(struct nci_dev *ndev) static int fdp_nci_create_conn(struct nci_dev *ndev)
......
...@@ -66,7 +66,7 @@ struct st21nfca_atr_req { ...@@ -66,7 +66,7 @@ struct st21nfca_atr_req {
u8 bsi; u8 bsi;
u8 bri; u8 bri;
u8 ppi; u8 ppi;
u8 gbi[0]; u8 gbi[];
} __packed; } __packed;
struct st21nfca_atr_res { struct st21nfca_atr_res {
...@@ -79,7 +79,7 @@ struct st21nfca_atr_res { ...@@ -79,7 +79,7 @@ struct st21nfca_atr_res {
u8 bri; u8 bri;
u8 to; u8 to;
u8 ppi; u8 ppi;
u8 gbi[0]; u8 gbi[];
} __packed; } __packed;
struct st21nfca_psl_req { struct st21nfca_psl_req {
......
...@@ -244,13 +244,13 @@ struct dest_spec_params { ...@@ -244,13 +244,13 @@ struct dest_spec_params {
struct core_conn_create_dest_spec_params { struct core_conn_create_dest_spec_params {
__u8 type; __u8 type;
__u8 length; __u8 length;
__u8 value[0]; __u8 value[];
} __packed; } __packed;
struct nci_core_conn_create_cmd { struct nci_core_conn_create_cmd {
__u8 destination_type; __u8 destination_type;
__u8 number_destination_params; __u8 number_destination_params;
struct core_conn_create_dest_spec_params params[0]; struct core_conn_create_dest_spec_params params[];
} __packed; } __packed;
#define NCI_OP_CORE_CONN_CLOSE_CMD nci_opcode_pack(NCI_GID_CORE, 0x05) #define NCI_OP_CORE_CONN_CLOSE_CMD nci_opcode_pack(NCI_GID_CORE, 0x05)
...@@ -321,7 +321,7 @@ struct nci_core_init_rsp_1 { ...@@ -321,7 +321,7 @@ struct nci_core_init_rsp_1 {
__u8 status; __u8 status;
__le32 nfcc_features; __le32 nfcc_features;
__u8 num_supported_rf_interfaces; __u8 num_supported_rf_interfaces;
__u8 supported_rf_interfaces[0]; /* variable size array */ __u8 supported_rf_interfaces[]; /* variable size array */
/* continuted in nci_core_init_rsp_2 */ /* continuted in nci_core_init_rsp_2 */
} __packed; } __packed;
...@@ -338,7 +338,7 @@ struct nci_core_init_rsp_2 { ...@@ -338,7 +338,7 @@ struct nci_core_init_rsp_2 {
struct nci_core_set_config_rsp { struct nci_core_set_config_rsp {
__u8 status; __u8 status;
__u8 num_params; __u8 num_params;
__u8 params_id[0]; /* variable size array */ __u8 params_id[]; /* variable size array */
} __packed; } __packed;
#define NCI_OP_CORE_CONN_CREATE_RSP nci_opcode_pack(NCI_GID_CORE, 0x04) #define NCI_OP_CORE_CONN_CREATE_RSP nci_opcode_pack(NCI_GID_CORE, 0x04)
...@@ -501,18 +501,18 @@ struct nci_rf_nfcee_action_ntf { ...@@ -501,18 +501,18 @@ struct nci_rf_nfcee_action_ntf {
__u8 nfcee_id; __u8 nfcee_id;
__u8 trigger; __u8 trigger;
__u8 supported_data_length; __u8 supported_data_length;
__u8 supported_data[0]; __u8 supported_data[];
} __packed; } __packed;
#define NCI_OP_NFCEE_DISCOVER_NTF nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00) #define NCI_OP_NFCEE_DISCOVER_NTF nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00)
struct nci_nfcee_supported_protocol { struct nci_nfcee_supported_protocol {
__u8 num_protocol; __u8 num_protocol;
__u8 supported_protocol[0]; __u8 supported_protocol[];
} __packed; } __packed;
struct nci_nfcee_information_tlv { struct nci_nfcee_information_tlv {
__u8 num_tlv; __u8 num_tlv;
__u8 information_tlv[0]; __u8 information_tlv[];
} __packed; } __packed;
struct nci_nfcee_discover_ntf { struct nci_nfcee_discover_ntf {
......
...@@ -146,7 +146,7 @@ struct nfc_evt_transaction { ...@@ -146,7 +146,7 @@ struct nfc_evt_transaction {
u32 aid_len; u32 aid_len;
u8 aid[NFC_MAX_AID_LENGTH]; u8 aid[NFC_MAX_AID_LENGTH];
u8 params_len; u8 params_len;
u8 params[0]; u8 params[];
} __packed; } __packed;
struct nfc_genl_data { struct nfc_genl_data {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment