History

treewide: Replace open-coded flex arrays in unions

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]; | ^~~~~~~

Kees Cook committed 5 years ago

Commit fa7845c1 parent 3080ea513 files · +56 −33Browse files

Unified · Split

13 files
  1. drivers/crypto/chelsio/chcr_crypto.h +9 −5
  2. drivers/net/can/usb/etas_es58x/es581_4.h +1 −1
  3. drivers/net/can/usb/etas_es58x/es58x_fd.h +1 −1
  4. drivers/net/wireless/ath/ath10k/htt.h +5 −2
  5. drivers/net/wireless/intel/iwlegacy/commands.h +4 −2
  6. drivers/net/wireless/intel/iwlwifi/dvm/commands.h +4 −2
  7. drivers/net/wireless/intel/iwlwifi/fw/api/tx.h +8 −4
  8. drivers/scsi/aic94xx/aic94xx_sds.c +4 −2
  9. fs/hpfs/hpfs.h +4 −4
  10. include/linux/filter.h +4 −2
  11. include/scsi/sas.h +8 −4
  12. include/uapi/rdma/rdma_user_rxe.h +2 −2
  13. include/uapi/sound/asoc.h +2 −2
drivers/crypto/chelsio/chcr_crypto.h+9−5
@@ -222,8 +222,10 @@ struct chcr_authenc_ctx { · 221 unmodified lines
222222 };
223223
224224 struct __aead_ctx {
225− struct chcr_gcm_ctx gcm[0];
226− struct chcr_authenc_ctx authenc[];
225+ union {
226+ DECLARE_FLEX_ARRAY(struct chcr_gcm_ctx, gcm);
227+ DECLARE_FLEX_ARRAY(struct chcr_authenc_ctx, authenc);
228+ };
227229 };
228230
229231 struct chcr_aead_ctx {
@@ -245,9 +247,11 @@ struct hmac_ctx { · 15 unmodified lines
245247 };
246248
247249 struct __crypto_ctx {
248− struct hmac_ctx hmacctx[0];
249− struct ablk_ctx ablkctx[0];
250− struct chcr_aead_ctx aeadctx[];
250+ union {
251+ DECLARE_FLEX_ARRAY(struct hmac_ctx, hmacctx);
252+ DECLARE_FLEX_ARRAY(struct ablk_ctx, ablkctx);
253+ DECLARE_FLEX_ARRAY(struct chcr_aead_ctx, aeadctx);
254+ };
251255 };
252256
253257 struct chcr_context {
drivers/net/can/usb/etas_es58x/es581_4.h+1−1
@@ -192,7 +192,7 @@ struct es581_4_urb_cmd { · 191 unmodified lines
192192 struct es581_4_rx_cmd_ret rx_cmd_ret;
193193 __le64 timestamp;
194194 u8 rx_cmd_ret_u8;
195− u8 raw_msg[0];
195+ DECLARE_FLEX_ARRAY(u8, raw_msg);
196196 } __packed;
197197
198198 __le16 reserved_for_crc16_do_not_use;
drivers/net/can/usb/etas_es58x/es58x_fd.h+1−1
@@ -219,7 +219,7 @@ struct es58x_fd_urb_cmd { · 218 unmodified lines
219219 struct es58x_fd_tx_ack_msg tx_ack_msg;
220220 __le64 timestamp;
221221 __le32 rx_cmd_ret_le32;
222− u8 raw_msg[0];
222+ DECLARE_FLEX_ARRAY(u8, raw_msg);
223223 } __packed;
224224
225225 __le16 reserved_for_crc16_do_not_use;
drivers/net/wireless/ath/ath10k/htt.h+5−2
@@ -1674,8 +1674,11 @@ struct htt_tx_fetch_ind { · 1673 unmodified lines
16741674 __le32 token;
16751675 __le16 num_resp_ids;
16761676 __le16 num_records;
1677− __le32 resp_ids[0]; /* ath10k_htt_get_tx_fetch_ind_resp_ids() */
1678− struct htt_tx_fetch_record records[];
1677+ union {
1678+ /* ath10k_htt_get_tx_fetch_ind_resp_ids() */
1679+ DECLARE_FLEX_ARRAY(__le32, resp_ids);
1680+ DECLARE_FLEX_ARRAY(struct htt_tx_fetch_record, records);
1681+ };
16791682 } __packed;
16801683
16811684 static inline void *
drivers/net/wireless/intel/iwlegacy/commands.h+4−2
@@ -1408,8 +1408,10 @@ struct il3945_tx_cmd { · 1407 unmodified lines
14081408 * MAC header goes here, followed by 2 bytes padding if MAC header
14091409 * length is 26 or 30 bytes, followed by payload data
14101410 */
1411− u8 payload[0];
1412− struct ieee80211_hdr hdr[];
1411+ union {
1412+ DECLARE_FLEX_ARRAY(u8, payload);
1413+ DECLARE_FLEX_ARRAY(struct ieee80211_hdr, hdr);
1414+ };
14131415 } __packed;
14141416
14151417 /*
drivers/net/wireless/intel/iwlwifi/dvm/commands.h+4−2
@@ -1251,8 +1251,10 @@ struct iwl_tx_cmd { · 1250 unmodified lines
12511251 * MAC header goes here, followed by 2 bytes padding if MAC header
12521252 * length is 26 or 30 bytes, followed by payload data
12531253 */
1254− u8 payload[0];
1255− struct ieee80211_hdr hdr[];
1254+ union {
1255+ DECLARE_FLEX_ARRAY(u8, payload);
1256+ DECLARE_FLEX_ARRAY(struct ieee80211_hdr, hdr);
1257+ };
12561258 } __packed;
12571259
12581260 /*
drivers/net/wireless/intel/iwlwifi/fw/api/tx.h+8−4
@@ -239,8 +239,10 @@ struct iwl_tx_cmd { · 238 unmodified lines
239239 u8 tid_tspec;
240240 __le16 pm_frame_timeout;
241241 __le16 reserved4;
242− u8 payload[0];
243− struct ieee80211_hdr hdr[0];
242+ union {
243+ DECLARE_FLEX_ARRAY(u8, payload);
244+ DECLARE_FLEX_ARRAY(struct ieee80211_hdr, hdr);
245+ };
244246 } __packed; /* TX_CMD_API_S_VER_6 */
245247
246248 struct iwl_dram_sec_info {
@@ -713,8 +715,10 @@ struct iwl_mvm_compressed_ba_notif { · 466 unmodified lines
713715 __le32 tx_rate;
714716 __le16 tfd_cnt;
715717 __le16 ra_tid_cnt;
716− struct iwl_mvm_compressed_ba_ratid ra_tid[0];
717− struct iwl_mvm_compressed_ba_tfd tfd[];
718+ union {
719+ DECLARE_FLEX_ARRAY(struct iwl_mvm_compressed_ba_ratid, ra_tid);
720+ DECLARE_FLEX_ARRAY(struct iwl_mvm_compressed_ba_tfd, tfd);
721+ };
718722 } __packed; /* COMPRESSED_BA_RES_API_S_VER_4 */
719723
720724 /**
drivers/scsi/aic94xx/aic94xx_sds.c+4−2
@@ -517,8 +517,10 @@ struct asd_ms_conn_map { · 516 unmodified lines
517517 u8 num_nodes;
518518 u8 usage_model_id;
519519 u32 _resvd;
520− struct asd_ms_conn_desc conn_desc[0];
521− struct asd_ms_node_desc node_desc[];
520+ union {
521+ DECLARE_FLEX_ARRAY(struct asd_ms_conn_desc, conn_desc);
522+ DECLARE_FLEX_ARRAY(struct asd_ms_node_desc, node_desc);
523+ };
522524 } __attribute__ ((packed));
523525
524526 struct asd_ctrla_phy_entry {
fs/hpfs/hpfs.h+4−4
@@ -409,10 +409,10 @@ struct bplus_header · 408 unmodified lines
409409 __le16 first_free; /* offset from start of header to
410410 first free node in array */
411411 union {
412− struct bplus_internal_node internal[0]; /* (internal) 2-word entries giving
413− subtree pointers */
414− struct bplus_leaf_node external[0]; /* (external) 3-word entries giving
415− sector runs */
412+ /* (internal) 2-word entries giving subtree pointers */
413+ DECLARE_FLEX_ARRAY(struct bplus_internal_node, internal);
414+ /* (external) 3-word entries giving sector runs */
415+ DECLARE_FLEX_ARRAY(struct bplus_leaf_node, external);
416416 } u;
417417 };
418418
include/linux/filter.h+4−2
@@ -586,8 +586,10 @@ struct bpf_prog { · 585 unmodified lines
586586 struct bpf_prog_aux *aux; /* Auxiliary fields */
587587 struct sock_fprog_kern *orig_prog; /* Original BPF program */
588588 /* Instructions for interpreter */
589− struct sock_filter insns[0];
590− struct bpf_insn insnsi[];
589+ union {
590+ DECLARE_FLEX_ARRAY(struct sock_filter, insns);
591+ DECLARE_FLEX_ARRAY(struct bpf_insn, insnsi);
592+ };
591593 };
592594
593595 struct sk_filter {
include/scsi/sas.h+8−4
@@ -323,8 +323,10 @@ struct ssp_response_iu { · 322 unmodified lines
323323 __be32 sense_data_len;
324324 __be32 response_data_len;
325325
326− u8 resp_data[0];
327− u8 sense_data[];
326+ union {
327+ DECLARE_FLEX_ARRAY(u8, resp_data);
328+ DECLARE_FLEX_ARRAY(u8, sense_data);
329+ };
328330 } __attribute__ ((packed));
329331
330332 struct ssp_command_iu {
@@ -554,8 +556,10 @@ struct ssp_response_iu { · 223 unmodified lines
554556 __be32 sense_data_len;
555557 __be32 response_data_len;
556558
557− u8 resp_data[0];
558− u8 sense_data[];
559+ union {
560+ DECLARE_FLEX_ARRAY(u8, resp_data);
561+ DECLARE_FLEX_ARRAY(u8, sense_data);
562+ };
559563 } __attribute__ ((packed));
560564
561565 struct ssp_command_iu {
include/uapi/rdma/rdma_user_rxe.h+2−2
@@ -141,8 +141,8 @@ struct rxe_dma_info { · 140 unmodified lines
141141 __u32 sge_offset;
142142 __u32 reserved;
143143 union {
144− __u8 inline_data[0];
145− struct rxe_sge sge[0];
144+ __DECLARE_FLEX_ARRAY(__u8, inline_data);
145+ __DECLARE_FLEX_ARRAY(struct rxe_sge, sge);
146146 };
147147 };
148148
include/uapi/sound/asoc.h+2−2
@@ -240,8 +240,8 @@ struct snd_soc_tplg_vendor_array { · 239 unmodified lines
240240 struct snd_soc_tplg_private {
241241 __le32 size; /* in bytes of private data */
242242 union {
243− char data[0];
244− struct snd_soc_tplg_vendor_array array[0];
243+ __DECLARE_FLEX_ARRAY(char, data);
244+ __DECLARE_FLEX_ARRAY(struct snd_soc_tplg_vendor_array, array);
245245 };
246246 } __attribute__((packed));
247247