]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
RDMA: Replace zero-length array with flexible-array member
authorGustavo A. R. Silva <gustavo@embeddedor.com>
Thu, 13 Feb 2020 01:04:25 +0000 (19:04 -0600)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 20 Feb 2020 17:33:51 +0000 (13:33 -0400)
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 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

Link: https://lore.kernel.org/r/20200213010425.GA13068@embeddedor.com
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> # added a few more
25 files changed:
drivers/infiniband/core/cache.c
drivers/infiniband/core/cm.c
drivers/infiniband/core/mad_priv.h
drivers/infiniband/core/multicast.c
drivers/infiniband/core/sa_query.c
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
drivers/infiniband/hw/cxgb4/t4fw_ri_api.h
drivers/infiniband/hw/hfi1/mad.c
drivers/infiniband/hw/hfi1/mad.h
drivers/infiniband/hw/hfi1/pio.h
drivers/infiniband/hw/hfi1/sdma.c
drivers/infiniband/hw/hfi1/sdma.h
drivers/infiniband/hw/hfi1/user_exp_rcv.h
drivers/infiniband/hw/i40iw/i40iw_cm.h
drivers/infiniband/hw/mthca/mthca_memfree.c
drivers/infiniband/hw/mthca/mthca_memfree.h
drivers/infiniband/hw/usnic/usnic_uiom.h
drivers/infiniband/sw/rxe/rxe_queue.h
drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.h
drivers/infiniband/ulp/srp/ib_srp.h
include/rdma/ib_fmr_pool.h
include/rdma/ib_verbs.h
include/rdma/opa_vnic.h
include/rdma/rdmavt_mr.h
include/rdma/rdmavt_qp.h

index 9bbdace3c809ffe2167351633b4ad9b20f881ab7..717b798cddad4f7f7e5bceeadb46476565a9543f 100644 (file)
@@ -46,7 +46,7 @@
 
 struct ib_pkey_cache {
        int             table_len;
-       u16             table[0];
+       u16             table[];
 };
 
 struct ib_update_work {
index 33c0d9e7bb66458bc1d9edd5552f59a00021c91c..aec6867f0ed20e6903547df54d6ede1ca5c7379e 100644 (file)
@@ -197,7 +197,7 @@ struct cm_device {
        struct ib_device *ib_device;
        u8 ack_delay;
        int going_down;
-       struct cm_port *port[0];
+       struct cm_port *port[];
 };
 
 struct cm_av {
@@ -216,7 +216,7 @@ struct cm_work {
        __be32 local_id;                        /* Established / timewait */
        __be32 remote_id;
        struct ib_cm_event cm_event;
-       struct sa_path_rec path[0];
+       struct sa_path_rec path[];
 };
 
 struct cm_timewait_info {
index 956b3a7dfed7ed990190dcee3e1d63f64b756313..403d8673a2f9eab555d339f137a05bddf3b31a06 100644 (file)
@@ -79,13 +79,13 @@ struct ib_mad_private {
        struct ib_mad_private_header header;
        size_t mad_size;
        struct ib_grh grh;
-       u8 mad[0];
+       u8 mad[];
 } __packed;
 
 struct ib_rmpp_segment {
        struct list_head list;
        u32 num;
-       u8 data[0];
+       u8 data[];
 };
 
 struct ib_mad_agent_private {
index cd338ddc4a39a6d2f5637794eaccfc6b7c2ac917..9c2d8b7f1af9c651652e9c33c3b70a019b035831 100644 (file)
@@ -71,7 +71,7 @@ struct mcast_device {
        struct ib_event_handler event_handler;
        int                     start_port;
        int                     end_port;
-       struct mcast_port       port[0];
+       struct mcast_port       port[];
 };
 
 enum mcast_state {
index 30d4c126a2db0bab7ab5be4b9824286daf3879ce..74e0058fcf9e1dc1ba9406d70377490ecfd9f5ed 100644 (file)
@@ -101,7 +101,7 @@ struct ib_sa_port {
 struct ib_sa_device {
        int                     start_port, end_port;
        struct ib_event_handler event_handler;
-       struct ib_sa_port port[0];
+       struct ib_sa_port port[];
 };
 
 struct ib_sa_query {
index 7d06b0f8d49a00a388375383bd89bf79b48ce4a6..e8e11bd95e4296e9bd8a5f11d56891c8ba26663a 100644 (file)
@@ -707,7 +707,7 @@ struct mpa_message {
        u8 flags;
        u8 revision;
        __be16 private_data_size;
-       u8 private_data[0];
+       u8 private_data[];
 };
 
 struct mpa_v2_conn_params {
@@ -719,7 +719,7 @@ struct terminate_message {
        u8 layer_etype;
        u8 ecode;
        __be16 hdrct_rsvd;
-       u8 len_hdrs[0];
+       u8 len_hdrs[];
 };
 
 #define TERM_MAX_LENGTH (sizeof(struct terminate_message) + 2 + 18 + 28)
index cbdb300a47943a73461a92ae0e7bfe1952d4fe82..a2f5e29ef2264dc841c8358b06e09df6a133a93f 100644 (file)
@@ -123,7 +123,7 @@ struct fw_ri_dsgl {
        __be32  len0;
        __be64  addr0;
 #ifndef C99_NOT_SUPPORTED
-       struct fw_ri_dsge_pair sge[0];
+       struct fw_ri_dsge_pair sge[];
 #endif
 };
 
@@ -139,7 +139,7 @@ struct fw_ri_isgl {
        __be16  nsge;
        __be32  r2;
 #ifndef C99_NOT_SUPPORTED
-       struct fw_ri_sge sge[0];
+       struct fw_ri_sge sge[];
 #endif
 };
 
@@ -149,7 +149,7 @@ struct fw_ri_immd {
        __be16  r2;
        __be32  immdlen;
 #ifndef C99_NOT_SUPPORTED
-       __u8    data[0];
+       __u8    data[];
 #endif
 };
 
@@ -321,7 +321,7 @@ struct fw_ri_res_wr {
        __be32 len16_pkd;
        __u64  cookie;
 #ifndef C99_NOT_SUPPORTED
-       struct fw_ri_res res[0];
+       struct fw_ri_res res[];
 #endif
 };
 
index a51bcd2b439128c190bc28b352fdf775b6fb86d1..7073f237a9493864cad7dd0dd9418ce31e18d3d9 100644 (file)
@@ -2381,7 +2381,7 @@ struct opa_port_status_rsp {
                __be64 port_vl_rcv_bubble;
                __be64 port_vl_mark_fecn;
                __be64 port_vl_xmit_discards;
-       } vls[0]; /* real array size defined by # bits set in vl_select_mask */
+       } vls[]; /* real array size defined by # bits set in vl_select_mask */
 };
 
 enum counter_selects {
@@ -2423,7 +2423,7 @@ struct opa_aggregate {
        __be16 attr_id;
        __be16 err_reqlength;   /* 1 bit, 8 res, 7 bit */
        __be32 attr_mod;
-       u8 data[0];
+       u8 data[];
 };
 
 #define MSK_LLI 0x000000f0
index 2f48e69536290c9a03d2c77969cd0b30f3ee4972..889e63d3f2ccd087699ce699a1310195913e70e1 100644 (file)
@@ -165,7 +165,7 @@ struct opa_mad_notice_attr {
                } __packed ntc_2048;
 
        };
-       u8      class_data[0];
+       u8      class_data[];
 };
 
 #define IB_VLARB_LOWPRI_0_31    1
index c9a58b642bdd6fea1f2ca767ca9e52eec80e36a2..0102262343c0f6175667933c00a039cf631d1f15 100644 (file)
@@ -243,7 +243,7 @@ struct sc_config_sizes {
  */
 struct pio_map_elem {
        u32 mask;
-       struct send_context *ksc[0];
+       struct send_context *ksc[];
 };
 
 /*
@@ -263,7 +263,7 @@ struct pio_vl_map {
        u32 mask;
        u8 actual_vls;
        u8 vls;
-       struct pio_map_elem *map[0];
+       struct pio_map_elem *map[];
 };
 
 int pio_map_init(struct hfi1_devdata *dd, u8 port, u8 num_vls,
index a51525647ac86bd4d6b210c75f2c83ef0717dd64..c93ea021cf4939ac78898acaa71a609d833653c9 100644 (file)
@@ -833,7 +833,7 @@ struct sdma_engine *sdma_select_engine_sc(
 struct sdma_rht_map_elem {
        u32 mask;
        u8 ctr;
-       struct sdma_engine *sde[0];
+       struct sdma_engine *sde[];
 };
 
 struct sdma_rht_node {
index 1e2e40f79cb2050494a23c15c4fce7204bf6876e..7a851191f9870f496b2b43c4c19c73b210a73606 100644 (file)
@@ -1002,7 +1002,7 @@ void sdma_engine_interrupt(struct sdma_engine *sde, u64 status);
  */
 struct sdma_map_elem {
        u32 mask;
-       struct sdma_engine *sde[0];
+       struct sdma_engine *sde[];
 };
 
 /**
@@ -1024,7 +1024,7 @@ struct sdma_vl_map {
        u32 mask;
        u8 actual_vls;
        u8 vls;
-       struct sdma_map_elem *map[0];
+       struct sdma_map_elem *map[];
 };
 
 int sdma_map_init(
index 6257eee083a1a389abe6a4b57b7e6eff9253cbb8..332abb446861a9354fea43c21dc5379ea2314625 100644 (file)
@@ -73,7 +73,7 @@ struct tid_rb_node {
        dma_addr_t dma_addr;
        bool freed;
        unsigned int npages;
-       struct page *pages[0];
+       struct page *pages[];
 };
 
 static inline int num_user_pages(unsigned long addr,
index 66dc1ba03389005a99118abd6efc067ed25533b2..6e43e4d730f4c4ba8000f2c524af834e4b7bb53d 100644 (file)
@@ -85,7 +85,7 @@ struct ietf_mpa_v1 {
        u8 flags;
        u8 rev;
        __be16 priv_data_len;
-       u8 priv_data[0];
+       u8 priv_data[];
 };
 
 #define ietf_mpa_req_resp_frame ietf_mpa_frame
@@ -101,7 +101,7 @@ struct ietf_mpa_v2 {
        u8 rev;
        __be16 priv_data_len;
        struct ietf_rtr_msg rtr_msg;
-       u8 priv_data[0];
+       u8 priv_data[];
 };
 
 struct i40iw_cm_node;
index 78a48aea3faf80c874c5b5ab6909c28b352e83af..fa808582b08b7c48be085182b4769e8801cc659f 100644 (file)
@@ -58,7 +58,7 @@ struct mthca_user_db_table {
                u64                uvirt;
                struct scatterlist mem;
                int                refcount;
-       }                page[0];
+       } page[];
 };
 
 static void mthca_free_icm_pages(struct mthca_dev *dev, struct mthca_icm_chunk *chunk)
index da9b8f9b884f3ac768b71c42d613e6f96a06bda8..f9a2e65e2ff59a7e75725ac91dff5347ad743db0 100644 (file)
@@ -68,7 +68,7 @@ struct mthca_icm_table {
        int               lowmem;
        int               coherent;
        struct mutex      mutex;
-       struct mthca_icm *icm[0];
+       struct mthca_icm *icm[];
 };
 
 struct mthca_icm_iter {
index 70be49b1ca0528a909cf4daf5f7078f12df020fd..7ec8991ace673e62fff9172ed605d3e328cecab1 100644 (file)
@@ -77,7 +77,7 @@ struct usnic_uiom_reg {
 struct usnic_uiom_chunk {
        struct list_head                list;
        int                             nents;
-       struct scatterlist              page_list[0];
+       struct scatterlist              page_list[];
 };
 
 struct usnic_uiom_pd *usnic_uiom_alloc_pd(void);
index acd0a925481c953c79e2fec14a0ec977841060b0..8ef17d61702214491307a00e39e370679bfeee12 100644 (file)
@@ -63,7 +63,7 @@ struct rxe_queue_buf {
        __u32                   pad_2[31];
        __u32                   consumer_index;
        __u32                   pad_3[31];
-       __u8                    data[0];
+       __u8                    data[];
 };
 
 struct rxe_queue {
index 4480092c68e097822b7bec01e5c95204e086f9a2..0b3570dc606d24b7a7992e668b95ee34f2104874 100644 (file)
@@ -258,7 +258,7 @@ struct opa_veswport_mactable {
        __be16                              offset;
        __be16                              num_entries;
        __be32                              mac_tbl_digest;
-       struct opa_veswport_mactable_entry  tbl_entries[0];
+       struct opa_veswport_mactable_entry  tbl_entries[];
 } __packed;
 
 /**
@@ -440,7 +440,7 @@ struct opa_veswport_iface_macs {
        __be16 num_macs_in_msg;
        __be16 tot_macs_in_lst;
        __be16 gen_count;
-       struct opa_vnic_iface_mac_entry entry[0];
+       struct opa_vnic_iface_mac_entry entry[];
 } __packed;
 
 /**
index 5359ece561cad8d8985ea8ad16e4a5f74a0b661c..6fabcc2faf1f081287f66f9ce9221f7563d4e5d1 100644 (file)
@@ -309,7 +309,7 @@ struct srp_fr_pool {
        int                     max_page_list_len;
        spinlock_t              lock;
        struct list_head        free_list;
-       struct srp_fr_desc      desc[0];
+       struct srp_fr_desc      desc[];
 };
 
 /**
index f8982e4e9702ad8dbf744ef85aa014fd5082019e..2fd9bfb6d648ccee46278b2647934395e03471e8 100644 (file)
@@ -73,7 +73,7 @@ struct ib_pool_fmr {
        int                 remap_count;
        u64                 io_virtual_address;
        int                 page_list_len;
-       u64                 page_list[0];
+       u64                 page_list[];
 };
 
 struct ib_fmr_pool *ib_create_fmr_pool(struct ib_pd             *pd,
index 5f3a04ead9f593ff48ccb1c85171c96944874083..bbc5cfb57cd2bb63912361537c6e716072536791 100644 (file)
@@ -1876,7 +1876,7 @@ struct ib_flow_eth_filter {
        __be16  ether_type;
        __be16  vlan_tag;
        /* Must be last */
-       u8      real_sz[0];
+       u8      real_sz[];
 };
 
 struct ib_flow_spec_eth {
@@ -1890,7 +1890,7 @@ struct ib_flow_ib_filter {
        __be16 dlid;
        __u8   sl;
        /* Must be last */
-       u8      real_sz[0];
+       u8      real_sz[];
 };
 
 struct ib_flow_spec_ib {
@@ -1915,7 +1915,7 @@ struct ib_flow_ipv4_filter {
        u8      ttl;
        u8      flags;
        /* Must be last */
-       u8      real_sz[0];
+       u8      real_sz[];
 };
 
 struct ib_flow_spec_ipv4 {
@@ -1933,7 +1933,7 @@ struct ib_flow_ipv6_filter {
        u8      traffic_class;
        u8      hop_limit;
        /* Must be last */
-       u8      real_sz[0];
+       u8      real_sz[];
 };
 
 struct ib_flow_spec_ipv6 {
@@ -1947,7 +1947,7 @@ struct ib_flow_tcp_udp_filter {
        __be16  dst_port;
        __be16  src_port;
        /* Must be last */
-       u8      real_sz[0];
+       u8      real_sz[];
 };
 
 struct ib_flow_spec_tcp_udp {
@@ -1959,7 +1959,7 @@ struct ib_flow_spec_tcp_udp {
 
 struct ib_flow_tunnel_filter {
        __be32  tunnel_id;
-       u8      real_sz[0];
+       u8      real_sz[];
 };
 
 /* ib_flow_spec_tunnel describes the Vxlan tunnel
@@ -1976,7 +1976,7 @@ struct ib_flow_esp_filter {
        __be32  spi;
        __be32  seq;
        /* Must be last */
-       u8      real_sz[0];
+       u8      real_sz[];
 };
 
 struct ib_flow_spec_esp {
@@ -1991,7 +1991,7 @@ struct ib_flow_gre_filter {
        __be16 protocol;
        __be32 key;
        /* Must be last */
-       u8      real_sz[0];
+       u8      real_sz[];
 };
 
 struct ib_flow_spec_gre {
@@ -2004,7 +2004,7 @@ struct ib_flow_spec_gre {
 struct ib_flow_mpls_filter {
        __be32 tag;
        /* Must be last */
-       u8      real_sz[0];
+       u8      real_sz[];
 };
 
 struct ib_flow_spec_mpls {
index 0c07a70bd7f61d707e1e897434c54baf53b93be6..e90b149fe92a0b1c8033c2e34315b6be2ab68d37 100644 (file)
@@ -75,7 +75,7 @@
 struct opa_vnic_rdma_netdev {
        struct rdma_netdev rn;  /* keep this first */
        /* followed by device private data */
-       char *dev_priv[0];
+       char *dev_priv[];
 };
 
 static inline void *opa_vnic_priv(const struct net_device *dev)
index 72a3856d4057f5ac72e0c0c5e3a5ecb41dfd8af1..ce6c888f7fe754d76ca3518d21b1fc7f20e8d8da 100644 (file)
@@ -85,7 +85,7 @@ struct rvt_mregion {
        u8  lkey_published;     /* in global table */
        struct percpu_ref refcount;
        struct completion comp; /* complete when refcount goes to zero */
-       struct rvt_segarray *map[0];    /* the segments */
+       struct rvt_segarray *map[];    /* the segments */
 };
 
 #define RVT_MAX_LKEY_TABLE_BITS 23
index 0d5c70e2d8ab334428b8edeeb33dbe11b05bc24d..5fc10108703a43d41e5493f92e11f914afd70805 100644 (file)
@@ -191,7 +191,7 @@ struct rvt_swqe {
        u32 ssn;                /* send sequence number */
        u32 length;             /* total length of data in sg_list */
        void *priv;             /* driver dependent field */
-       struct rvt_sge sg_list[0];
+       struct rvt_sge sg_list[];
 };
 
 /**