Commit 3f6e9633 authored by Gustavo A. R. Silva's avatar Gustavo A. R. Silva Committed by David S. Miller
Browse files

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 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 f49b2759
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -104,14 +104,14 @@ struct cmsg_req_map_op {
	__be32 tid;
	__be32 count;
	__be32 flags;
	u8 data[0];
	u8 data[];
};

struct cmsg_reply_map_op {
	struct cmsg_reply_map_simple reply_hdr;
	__be32 count;
	__be32 resv;
	u8 data[0];
	u8 data[];
};

struct cmsg_bpf_event {
@@ -120,6 +120,6 @@ struct cmsg_bpf_event {
	__be64 map_ptr;
	__be32 data_size;
	__be32 pkt_size;
	u8 data[0];
	u8 data[];
};
#endif
+2 −2
Original line number Diff line number Diff line
@@ -587,7 +587,7 @@ struct nfp_flower_cmsg_mac_repr {
		u8 info;
		u8 nbi_port;
		u8 phys_port;
	} ports[0];
	} ports[];
};

#define NFP_FLOWER_CMSG_MAC_REPR_NBI		GENMASK(1, 0)
@@ -619,7 +619,7 @@ struct nfp_flower_cmsg_merge_hint {
	struct {
		__be32 host_ctx;
		__be64 host_cookie;
	} __packed flow[0];
	} __packed flow[];
};

enum nfp_flower_cmsg_port_type {
+1 −1
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ struct nfp_shared_buf;
 */
struct nfp_dumpspec {
	u32 size;
	u8 data[0];
	u8 data[];
};

/**
+4 −4
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ enum nfp_dumpspec_type {
struct nfp_dump_tl {
	__be32 type;
	__be32 length;	/* chunk length to follow, aligned to 8 bytes */
	char data[0];
	char data[];
};

/* NFP CPP parameters */
@@ -62,7 +62,7 @@ struct nfp_dumpspec_csr {

struct nfp_dumpspec_rtsym {
	struct nfp_dump_tl tl;
	char rtsym[0];
	char rtsym[];
};

/* header for register dumpable */
@@ -79,7 +79,7 @@ struct nfp_dump_rtsym {
	struct nfp_dump_common_cpp cpp;
	__be32 error;		/* error code encountered while reading */
	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 */
};

@@ -92,7 +92,7 @@ struct nfp_dump_error {
	struct nfp_dump_tl tl;
	__be32 error;
	char padding[4];
	char spec[0];
	char spec[];
};

/* to track state through debug size calculation TLV traversal */
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ struct nfp_port;
 */
struct nfp_reprs {
	unsigned int num_reprs;
	struct net_device __rcu *reprs[0];
	struct net_device __rcu *reprs[];
};

/**
Loading