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

mlxsw: 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>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Tested-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e96bd2d3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ struct mlxsw_core {
	struct mlxsw_core_port *ports;
	unsigned int max_ports;
	bool fw_flash_in_progress;
	unsigned long driver_priv[0];
	unsigned long driver_priv[];
	/* driver_priv has to be always the last item */
};

+1 −1
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ struct mlxsw_afk_key_info {
						      * is index inside "blocks"
						      */
	struct mlxsw_afk_element_usage elusage;
	const struct mlxsw_afk_block *blocks[0];
	const struct mlxsw_afk_block *blocks[];
};

static bool
+1 −1
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ static const struct mlxsw_sp1_kvdl_part_info mlxsw_sp1_kvdl_parts_info[] = {

struct mlxsw_sp1_kvdl_part {
	struct mlxsw_sp1_kvdl_part_info info;
	unsigned long usage[0];	/* Entries */
	unsigned long usage[];	/* Entries */
};

struct mlxsw_sp1_kvdl {
+1 −1
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ struct mlxsw_sp2_kvdl_part {
	unsigned int usage_bit_count;
	unsigned int indexes_per_usage_bit;
	unsigned int last_allocated_bit;
	unsigned long usage[0];	/* Usage bits */
	unsigned long usage[];	/* Usage bits */
};

struct mlxsw_sp2_kvdl {
+2 −2
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ struct mlxsw_sp_acl_ruleset {
	struct mlxsw_sp_acl_ruleset_ht_key ht_key;
	struct rhashtable rule_ht;
	unsigned int ref_count;
	unsigned long priv[0];
	unsigned long priv[];
	/* priv has to be always the last item */
};

@@ -71,7 +71,7 @@ struct mlxsw_sp_acl_rule {
	u64 last_used;
	u64 last_packets;
	u64 last_bytes;
	unsigned long priv[0];
	unsigned long priv[];
	/* priv has to be always the last item */
};

Loading