mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-25 21:55:41 +07:00
netronome: 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 7649773293
("cxgb3/l2t: Fix undefined behaviour")
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f49b275982
commit
3f6e963305
@ -104,14 +104,14 @@ struct cmsg_req_map_op {
|
|||||||
__be32 tid;
|
__be32 tid;
|
||||||
__be32 count;
|
__be32 count;
|
||||||
__be32 flags;
|
__be32 flags;
|
||||||
u8 data[0];
|
u8 data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cmsg_reply_map_op {
|
struct cmsg_reply_map_op {
|
||||||
struct cmsg_reply_map_simple reply_hdr;
|
struct cmsg_reply_map_simple reply_hdr;
|
||||||
__be32 count;
|
__be32 count;
|
||||||
__be32 resv;
|
__be32 resv;
|
||||||
u8 data[0];
|
u8 data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cmsg_bpf_event {
|
struct cmsg_bpf_event {
|
||||||
@ -120,6 +120,6 @@ struct cmsg_bpf_event {
|
|||||||
__be64 map_ptr;
|
__be64 map_ptr;
|
||||||
__be32 data_size;
|
__be32 data_size;
|
||||||
__be32 pkt_size;
|
__be32 pkt_size;
|
||||||
u8 data[0];
|
u8 data[];
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -587,7 +587,7 @@ struct nfp_flower_cmsg_mac_repr {
|
|||||||
u8 info;
|
u8 info;
|
||||||
u8 nbi_port;
|
u8 nbi_port;
|
||||||
u8 phys_port;
|
u8 phys_port;
|
||||||
} ports[0];
|
} ports[];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NFP_FLOWER_CMSG_MAC_REPR_NBI GENMASK(1, 0)
|
#define NFP_FLOWER_CMSG_MAC_REPR_NBI GENMASK(1, 0)
|
||||||
@ -619,7 +619,7 @@ struct nfp_flower_cmsg_merge_hint {
|
|||||||
struct {
|
struct {
|
||||||
__be32 host_ctx;
|
__be32 host_ctx;
|
||||||
__be64 host_cookie;
|
__be64 host_cookie;
|
||||||
} __packed flow[0];
|
} __packed flow[];
|
||||||
};
|
};
|
||||||
|
|
||||||
enum nfp_flower_cmsg_port_type {
|
enum nfp_flower_cmsg_port_type {
|
||||||
|
@ -42,7 +42,7 @@ struct nfp_shared_buf;
|
|||||||
*/
|
*/
|
||||||
struct nfp_dumpspec {
|
struct nfp_dumpspec {
|
||||||
u32 size;
|
u32 size;
|
||||||
u8 data[0];
|
u8 data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -36,7 +36,7 @@ enum nfp_dumpspec_type {
|
|||||||
struct nfp_dump_tl {
|
struct nfp_dump_tl {
|
||||||
__be32 type;
|
__be32 type;
|
||||||
__be32 length; /* chunk length to follow, aligned to 8 bytes */
|
__be32 length; /* chunk length to follow, aligned to 8 bytes */
|
||||||
char data[0];
|
char data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* NFP CPP parameters */
|
/* NFP CPP parameters */
|
||||||
@ -62,7 +62,7 @@ struct nfp_dumpspec_csr {
|
|||||||
|
|
||||||
struct nfp_dumpspec_rtsym {
|
struct nfp_dumpspec_rtsym {
|
||||||
struct nfp_dump_tl tl;
|
struct nfp_dump_tl tl;
|
||||||
char rtsym[0];
|
char rtsym[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* header for register dumpable */
|
/* header for register dumpable */
|
||||||
@ -79,7 +79,7 @@ struct nfp_dump_rtsym {
|
|||||||
struct nfp_dump_common_cpp cpp;
|
struct nfp_dump_common_cpp cpp;
|
||||||
__be32 error; /* error code encountered while reading */
|
__be32 error; /* error code encountered while reading */
|
||||||
u8 padded_name_length; /* pad so data starts at 8 byte boundary */
|
u8 padded_name_length; /* pad so data starts at 8 byte boundary */
|
||||||
char rtsym[0];
|
char rtsym[];
|
||||||
/* after padded_name_length, there is dump_length data */
|
/* after padded_name_length, there is dump_length data */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ struct nfp_dump_error {
|
|||||||
struct nfp_dump_tl tl;
|
struct nfp_dump_tl tl;
|
||||||
__be32 error;
|
__be32 error;
|
||||||
char padding[4];
|
char padding[4];
|
||||||
char spec[0];
|
char spec[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* to track state through debug size calculation TLV traversal */
|
/* to track state through debug size calculation TLV traversal */
|
||||||
|
@ -18,7 +18,7 @@ struct nfp_port;
|
|||||||
*/
|
*/
|
||||||
struct nfp_reprs {
|
struct nfp_reprs {
|
||||||
unsigned int num_reprs;
|
unsigned int num_reprs;
|
||||||
struct net_device __rcu *reprs[0];
|
struct net_device __rcu *reprs[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -183,7 +183,7 @@ struct nfp_eth_table {
|
|||||||
bool is_split;
|
bool is_split;
|
||||||
|
|
||||||
unsigned int fec_modes_supported;
|
unsigned int fec_modes_supported;
|
||||||
} ports[0];
|
} ports[];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nfp_eth_table *nfp_eth_read_ports(struct nfp_cpp *cpp);
|
struct nfp_eth_table *nfp_eth_read_ports(struct nfp_cpp *cpp);
|
||||||
|
Loading…
Reference in New Issue
Block a user