Skip to content

Commit

Permalink
treewide: Replace open-coded flex arrays in unions
Browse files Browse the repository at this point in the history
In support of enabling -Warray-bounds and -Wzero-length-bounds and
correctly handling run-time memcpy() bounds checking, replace all
open-coded flexible arrays (i.e. 0-element arrays) in unions with the
DECLARE_FLEX_ARRAY() helper macro.

This fixes warnings such as:

fs/hpfs/anode.c: In function 'hpfs_add_sector_to_btree':
fs/hpfs/anode.c:209:27: warning: array subscript 0 is outside the bounds of an interior zero-length array 'struct bplus_internal_node[0]' [-Wzero-length-bounds]
  209 |    anode->btree.u.internal[0].down = cpu_to_le32(a);
      |    ~~~~~~~~~~~~~~~~~~~~~~~^~~
In file included from fs/hpfs/hpfs_fn.h:26,
                 from fs/hpfs/anode.c:10:
fs/hpfs/hpfs.h:412:32: note: while referencing 'internal'
  412 |     struct bplus_internal_node internal[0]; /* (internal) 2-word entries giving
      |                                ^~~~~~~~

drivers/net/can/usb/etas_es58x/es58x_fd.c: In function 'es58x_fd_tx_can_msg':
drivers/net/can/usb/etas_es58x/es58x_fd.c:360:35: warning: array subscript 65535 is outside the bounds of an interior zero-length array 'u8[0]' {aka 'unsigned char[]'} [-Wzero-length-bounds]
  360 |  tx_can_msg = (typeof(tx_can_msg))&es58x_fd_urb_cmd->raw_msg[msg_len];
      |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/can/usb/etas_es58x/es58x_core.h:22,
                 from drivers/net/can/usb/etas_es58x/es58x_fd.c:17:
drivers/net/can/usb/etas_es58x/es58x_fd.h:231:6: note: while referencing 'raw_msg'
  231 |   u8 raw_msg[0];
      |      ^~~~~~~

Cc: "Gustavo A. R. Silva" <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Ayush Sawal <[email protected]>
Cc: Vinay Kumar Yadav <[email protected]>
Cc: Rohit Maheshwari <[email protected]>
Cc: Herbert Xu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Kalle Valo <[email protected]>
Cc: Jakub Kicinski <[email protected]>
Cc: Stanislaw Gruszka <[email protected]>
Cc: Luca Coelho <[email protected]>
Cc: "James E.J. Bottomley" <[email protected]>
Cc: "Martin K. Petersen" <[email protected]>
Cc: Alexei Starovoitov <[email protected]>
Cc: Daniel Borkmann <[email protected]>
Cc: Andrii Nakryiko <[email protected]>
Cc: Martin KaFai Lau <[email protected]>
Cc: Song Liu <[email protected]>
Cc: Yonghong Song <[email protected]>
Cc: John Fastabend <[email protected]>
Cc: KP Singh <[email protected]>
Cc: Johannes Berg <[email protected]>
Cc: Mordechay Goodstein <[email protected]>
Cc: Lee Jones <[email protected]>
Cc: Wolfgang Grandegger <[email protected]>
Cc: Marc Kleine-Budde <[email protected]>
Cc: Arunachalam Santhanam <[email protected]>
Cc: Vincent Mailhol <[email protected]>
Cc: Mikulas Patocka <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Acked-by: Marc Kleine-Budde <[email protected]> # drivers/net/can/usb/etas_es58x/*
Signed-off-by: Kees Cook <[email protected]>
  • Loading branch information
kees committed Oct 18, 2021
1 parent 3080ea5 commit fa7845c
Show file tree
Hide file tree
Showing 13 changed files with 56 additions and 33 deletions.
14 changes: 9 additions & 5 deletions drivers/crypto/chelsio/chcr_crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,10 @@ struct chcr_authenc_ctx {
};

struct __aead_ctx {
struct chcr_gcm_ctx gcm[0];
struct chcr_authenc_ctx authenc[];
union {
DECLARE_FLEX_ARRAY(struct chcr_gcm_ctx, gcm);
DECLARE_FLEX_ARRAY(struct chcr_authenc_ctx, authenc);
};
};

struct chcr_aead_ctx {
Expand All @@ -245,9 +247,11 @@ struct hmac_ctx {
};

struct __crypto_ctx {
struct hmac_ctx hmacctx[0];
struct ablk_ctx ablkctx[0];
struct chcr_aead_ctx aeadctx[];
union {
DECLARE_FLEX_ARRAY(struct hmac_ctx, hmacctx);
DECLARE_FLEX_ARRAY(struct ablk_ctx, ablkctx);
DECLARE_FLEX_ARRAY(struct chcr_aead_ctx, aeadctx);
};
};

struct chcr_context {
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/usb/etas_es58x/es581_4.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ struct es581_4_urb_cmd {
struct es581_4_rx_cmd_ret rx_cmd_ret;
__le64 timestamp;
u8 rx_cmd_ret_u8;
u8 raw_msg[0];
DECLARE_FLEX_ARRAY(u8, raw_msg);
} __packed;

__le16 reserved_for_crc16_do_not_use;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/usb/etas_es58x/es58x_fd.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ struct es58x_fd_urb_cmd {
struct es58x_fd_tx_ack_msg tx_ack_msg;
__le64 timestamp;
__le32 rx_cmd_ret_le32;
u8 raw_msg[0];
DECLARE_FLEX_ARRAY(u8, raw_msg);
} __packed;

__le16 reserved_for_crc16_do_not_use;
Expand Down
7 changes: 5 additions & 2 deletions drivers/net/wireless/ath/ath10k/htt.h
Original file line number Diff line number Diff line change
Expand Up @@ -1674,8 +1674,11 @@ struct htt_tx_fetch_ind {
__le32 token;
__le16 num_resp_ids;
__le16 num_records;
__le32 resp_ids[0]; /* ath10k_htt_get_tx_fetch_ind_resp_ids() */
struct htt_tx_fetch_record records[];
union {
/* ath10k_htt_get_tx_fetch_ind_resp_ids() */
DECLARE_FLEX_ARRAY(__le32, resp_ids);
DECLARE_FLEX_ARRAY(struct htt_tx_fetch_record, records);
};
} __packed;

static inline void *
Expand Down
6 changes: 4 additions & 2 deletions drivers/net/wireless/intel/iwlegacy/commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -1408,8 +1408,10 @@ struct il3945_tx_cmd {
* MAC header goes here, followed by 2 bytes padding if MAC header
* length is 26 or 30 bytes, followed by payload data
*/
u8 payload[0];
struct ieee80211_hdr hdr[];
union {
DECLARE_FLEX_ARRAY(u8, payload);
DECLARE_FLEX_ARRAY(struct ieee80211_hdr, hdr);
};
} __packed;

/*
Expand Down
6 changes: 4 additions & 2 deletions drivers/net/wireless/intel/iwlwifi/dvm/commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -1251,8 +1251,10 @@ struct iwl_tx_cmd {
* MAC header goes here, followed by 2 bytes padding if MAC header
* length is 26 or 30 bytes, followed by payload data
*/
u8 payload[0];
struct ieee80211_hdr hdr[];
union {
DECLARE_FLEX_ARRAY(u8, payload);
DECLARE_FLEX_ARRAY(struct ieee80211_hdr, hdr);
};
} __packed;

/*
Expand Down
12 changes: 8 additions & 4 deletions drivers/net/wireless/intel/iwlwifi/fw/api/tx.h
Original file line number Diff line number Diff line change
Expand Up @@ -239,8 +239,10 @@ struct iwl_tx_cmd {
u8 tid_tspec;
__le16 pm_frame_timeout;
__le16 reserved4;
u8 payload[0];
struct ieee80211_hdr hdr[0];
union {
DECLARE_FLEX_ARRAY(u8, payload);
DECLARE_FLEX_ARRAY(struct ieee80211_hdr, hdr);
};
} __packed; /* TX_CMD_API_S_VER_6 */

struct iwl_dram_sec_info {
Expand Down Expand Up @@ -713,8 +715,10 @@ struct iwl_mvm_compressed_ba_notif {
__le32 tx_rate;
__le16 tfd_cnt;
__le16 ra_tid_cnt;
struct iwl_mvm_compressed_ba_ratid ra_tid[0];
struct iwl_mvm_compressed_ba_tfd tfd[];
union {
DECLARE_FLEX_ARRAY(struct iwl_mvm_compressed_ba_ratid, ra_tid);
DECLARE_FLEX_ARRAY(struct iwl_mvm_compressed_ba_tfd, tfd);
};
} __packed; /* COMPRESSED_BA_RES_API_S_VER_4 */

/**
Expand Down
6 changes: 4 additions & 2 deletions drivers/scsi/aic94xx/aic94xx_sds.c
Original file line number Diff line number Diff line change
Expand Up @@ -517,8 +517,10 @@ struct asd_ms_conn_map {
u8 num_nodes;
u8 usage_model_id;
u32 _resvd;
struct asd_ms_conn_desc conn_desc[0];
struct asd_ms_node_desc node_desc[];
union {
DECLARE_FLEX_ARRAY(struct asd_ms_conn_desc, conn_desc);
DECLARE_FLEX_ARRAY(struct asd_ms_node_desc, node_desc);
};
} __attribute__ ((packed));

struct asd_ctrla_phy_entry {
Expand Down
8 changes: 4 additions & 4 deletions fs/hpfs/hpfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -409,10 +409,10 @@ struct bplus_header
__le16 first_free; /* offset from start of header to
first free node in array */
union {
struct bplus_internal_node internal[0]; /* (internal) 2-word entries giving
subtree pointers */
struct bplus_leaf_node external[0]; /* (external) 3-word entries giving
sector runs */
/* (internal) 2-word entries giving subtree pointers */
DECLARE_FLEX_ARRAY(struct bplus_internal_node, internal);
/* (external) 3-word entries giving sector runs */
DECLARE_FLEX_ARRAY(struct bplus_leaf_node, external);
} u;
};

Expand Down
6 changes: 4 additions & 2 deletions include/linux/filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -586,8 +586,10 @@ struct bpf_prog {
struct bpf_prog_aux *aux; /* Auxiliary fields */
struct sock_fprog_kern *orig_prog; /* Original BPF program */
/* Instructions for interpreter */
struct sock_filter insns[0];
struct bpf_insn insnsi[];
union {
DECLARE_FLEX_ARRAY(struct sock_filter, insns);
DECLARE_FLEX_ARRAY(struct bpf_insn, insnsi);
};
};

struct sk_filter {
Expand Down
12 changes: 8 additions & 4 deletions include/scsi/sas.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,10 @@ struct ssp_response_iu {
__be32 sense_data_len;
__be32 response_data_len;

u8 resp_data[0];
u8 sense_data[];
union {
DECLARE_FLEX_ARRAY(u8, resp_data);
DECLARE_FLEX_ARRAY(u8, sense_data);
};
} __attribute__ ((packed));

struct ssp_command_iu {
Expand Down Expand Up @@ -554,8 +556,10 @@ struct ssp_response_iu {
__be32 sense_data_len;
__be32 response_data_len;

u8 resp_data[0];
u8 sense_data[];
union {
DECLARE_FLEX_ARRAY(u8, resp_data);
DECLARE_FLEX_ARRAY(u8, sense_data);
};
} __attribute__ ((packed));

struct ssp_command_iu {
Expand Down
4 changes: 2 additions & 2 deletions include/uapi/rdma/rdma_user_rxe.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,8 @@ struct rxe_dma_info {
__u32 sge_offset;
__u32 reserved;
union {
__u8 inline_data[0];
struct rxe_sge sge[0];
__DECLARE_FLEX_ARRAY(__u8, inline_data);
__DECLARE_FLEX_ARRAY(struct rxe_sge, sge);
};
};

Expand Down
4 changes: 2 additions & 2 deletions include/uapi/sound/asoc.h
Original file line number Diff line number Diff line change
Expand Up @@ -240,8 +240,8 @@ struct snd_soc_tplg_vendor_array {
struct snd_soc_tplg_private {
__le32 size; /* in bytes of private data */
union {
char data[0];
struct snd_soc_tplg_vendor_array array[0];
__DECLARE_FLEX_ARRAY(char, data);
__DECLARE_FLEX_ARRAY(struct snd_soc_tplg_vendor_array, array);
};
} __attribute__((packed));

Expand Down

0 comments on commit fa7845c

Please sign in to comment.