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
222};222};
223 223
224struct __aead_ctx {224struct __aead_ctx {
225 struct chcr_gcm_ctx gcm[0];225 union {
226 struct chcr_authenc_ctx authenc[];226 DECLARE_FLEX_ARRAY(struct chcr_gcm_ctx, gcm);
227 DECLARE_FLEX_ARRAY(struct chcr_authenc_ctx, authenc);
228 };
227};229};
228 230
229struct chcr_aead_ctx {231struct chcr_aead_ctx {
@@ -245,9 +247,11 @@ struct hmac_ctx { · 15 unmodified lines
245};247};
246 248
247struct __crypto_ctx {249struct __crypto_ctx {
248 struct hmac_ctx hmacctx[0];250 union {
249 struct ablk_ctx ablkctx[0];251 DECLARE_FLEX_ARRAY(struct hmac_ctx, hmacctx);
250 struct chcr_aead_ctx aeadctx[];252 DECLARE_FLEX_ARRAY(struct ablk_ctx, ablkctx);
253 DECLARE_FLEX_ARRAY(struct chcr_aead_ctx, aeadctx);
254 };
251};255};
252 256
253struct chcr_context {257struct 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
192 struct es581_4_rx_cmd_ret rx_cmd_ret;192 struct es581_4_rx_cmd_ret rx_cmd_ret;
193 __le64 timestamp;193 __le64 timestamp;
194 u8 rx_cmd_ret_u8;194 u8 rx_cmd_ret_u8;
195 u8 raw_msg[0];195 DECLARE_FLEX_ARRAY(u8, raw_msg);
196 } __packed;196 } __packed;
197 197
198 __le16 reserved_for_crc16_do_not_use;198 __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
219 struct es58x_fd_tx_ack_msg tx_ack_msg;219 struct es58x_fd_tx_ack_msg tx_ack_msg;
220 __le64 timestamp;220 __le64 timestamp;
221 __le32 rx_cmd_ret_le32;221 __le32 rx_cmd_ret_le32;
222 u8 raw_msg[0];222 DECLARE_FLEX_ARRAY(u8, raw_msg);
223 } __packed;223 } __packed;
224 224
225 __le16 reserved_for_crc16_do_not_use;225 __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
1674 __le32 token;1674 __le32 token;
1675 __le16 num_resp_ids;1675 __le16 num_resp_ids;
1676 __le16 num_records;1676 __le16 num_records;
1677 __le32 resp_ids[0]; /* ath10k_htt_get_tx_fetch_ind_resp_ids() */1677 union {
1678 struct htt_tx_fetch_record records[];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 };
1679} __packed;1682} __packed;
1680 1683
1681static inline void *1684static inline void *
drivers/net/wireless/intel/iwlegacy/commands.h+4−2
@@ -1408,8 +1408,10 @@ struct il3945_tx_cmd { · 1407 unmodified lines
1408 * MAC header goes here, followed by 2 bytes padding if MAC header1408 * MAC header goes here, followed by 2 bytes padding if MAC header
1409 * length is 26 or 30 bytes, followed by payload data1409 * length is 26 or 30 bytes, followed by payload data
1410 */1410 */
1411 u8 payload[0];1411 union {
1412 struct ieee80211_hdr hdr[];1412 DECLARE_FLEX_ARRAY(u8, payload);
1413 DECLARE_FLEX_ARRAY(struct ieee80211_hdr, hdr);
1414 };
1413} __packed;1415} __packed;
1414 1416
1415/*1417/*
drivers/net/wireless/intel/iwlwifi/dvm/commands.h+4−2
@@ -1251,8 +1251,10 @@ struct iwl_tx_cmd { · 1250 unmodified lines
1251 * MAC header goes here, followed by 2 bytes padding if MAC header1251 * MAC header goes here, followed by 2 bytes padding if MAC header
1252 * length is 26 or 30 bytes, followed by payload data1252 * length is 26 or 30 bytes, followed by payload data
1253 */1253 */
1254 u8 payload[0];1254 union {
1255 struct ieee80211_hdr hdr[];1255 DECLARE_FLEX_ARRAY(u8, payload);
1256 DECLARE_FLEX_ARRAY(struct ieee80211_hdr, hdr);
1257 };
1256} __packed;1258} __packed;
1257 1259
1258/*1260/*
drivers/net/wireless/intel/iwlwifi/fw/api/tx.h+8−4
@@ -239,8 +239,10 @@ struct iwl_tx_cmd { · 238 unmodified lines
239 u8 tid_tspec;239 u8 tid_tspec;
240 __le16 pm_frame_timeout;240 __le16 pm_frame_timeout;
241 __le16 reserved4;241 __le16 reserved4;
242 u8 payload[0];242 union {
243 struct ieee80211_hdr hdr[0];243 DECLARE_FLEX_ARRAY(u8, payload);
244 DECLARE_FLEX_ARRAY(struct ieee80211_hdr, hdr);
245 };
244} __packed; /* TX_CMD_API_S_VER_6 */246} __packed; /* TX_CMD_API_S_VER_6 */
245 247
246struct iwl_dram_sec_info {248struct iwl_dram_sec_info {
@@ -713,8 +715,10 @@ struct iwl_mvm_compressed_ba_notif { · 466 unmodified lines
713 __le32 tx_rate;715 __le32 tx_rate;
714 __le16 tfd_cnt;716 __le16 tfd_cnt;
715 __le16 ra_tid_cnt;717 __le16 ra_tid_cnt;
716 struct iwl_mvm_compressed_ba_ratid ra_tid[0];718 union {
717 struct iwl_mvm_compressed_ba_tfd tfd[];719 DECLARE_FLEX_ARRAY(struct iwl_mvm_compressed_ba_ratid, ra_tid);
720 DECLARE_FLEX_ARRAY(struct iwl_mvm_compressed_ba_tfd, tfd);
721 };
718} __packed; /* COMPRESSED_BA_RES_API_S_VER_4 */722} __packed; /* COMPRESSED_BA_RES_API_S_VER_4 */
719 723
720/**724/**
drivers/scsi/aic94xx/aic94xx_sds.c+4−2
@@ -517,8 +517,10 @@ struct asd_ms_conn_map { · 516 unmodified lines
517 u8 num_nodes;517 u8 num_nodes;
518 u8 usage_model_id;518 u8 usage_model_id;
519 u32 _resvd;519 u32 _resvd;
520 struct asd_ms_conn_desc conn_desc[0];520 union {
521 struct asd_ms_node_desc node_desc[];521 DECLARE_FLEX_ARRAY(struct asd_ms_conn_desc, conn_desc);
522 DECLARE_FLEX_ARRAY(struct asd_ms_node_desc, node_desc);
523 };
522} __attribute__ ((packed));524} __attribute__ ((packed));
523 525
524struct asd_ctrla_phy_entry {526struct asd_ctrla_phy_entry {
fs/hpfs/hpfs.h+4−4
@@ -409,10 +409,10 @@ struct bplus_header · 408 unmodified lines
409 __le16 first_free; /* offset from start of header to409 __le16 first_free; /* offset from start of header to
410 first free node in array */410 first free node in array */
411 union {411 union {
412 struct bplus_internal_node internal[0]; /* (internal) 2-word entries giving412 /* (internal) 2-word entries giving subtree pointers */
413 subtree pointers */413 DECLARE_FLEX_ARRAY(struct bplus_internal_node, internal);
414 struct bplus_leaf_node external[0]; /* (external) 3-word entries giving414 /* (external) 3-word entries giving sector runs */
415 sector runs */415 DECLARE_FLEX_ARRAY(struct bplus_leaf_node, external);
416 } u;416 } u;
417};417};
418 418
include/linux/filter.h+4−2
@@ -586,8 +586,10 @@ struct bpf_prog { · 585 unmodified lines
586 struct bpf_prog_aux *aux; /* Auxiliary fields */586 struct bpf_prog_aux *aux; /* Auxiliary fields */
587 struct sock_fprog_kern *orig_prog; /* Original BPF program */587 struct sock_fprog_kern *orig_prog; /* Original BPF program */
588 /* Instructions for interpreter */588 /* Instructions for interpreter */
589 struct sock_filter insns[0];589 union {
590 struct bpf_insn insnsi[];590 DECLARE_FLEX_ARRAY(struct sock_filter, insns);
591 DECLARE_FLEX_ARRAY(struct bpf_insn, insnsi);
592 };
591};593};
592 594
593struct sk_filter {595struct sk_filter {
include/scsi/sas.h+8−4
@@ -323,8 +323,10 @@ struct ssp_response_iu { · 322 unmodified lines
323 __be32 sense_data_len;323 __be32 sense_data_len;
324 __be32 response_data_len;324 __be32 response_data_len;
325 325
326 u8 resp_data[0];326 union {
327 u8 sense_data[];327 DECLARE_FLEX_ARRAY(u8, resp_data);
328 DECLARE_FLEX_ARRAY(u8, sense_data);
329 };
328} __attribute__ ((packed));330} __attribute__ ((packed));
329 331
330struct ssp_command_iu {332struct ssp_command_iu {
@@ -554,8 +556,10 @@ struct ssp_response_iu { · 223 unmodified lines
554 __be32 sense_data_len;556 __be32 sense_data_len;
555 __be32 response_data_len;557 __be32 response_data_len;
556 558
557 u8 resp_data[0];559 union {
558 u8 sense_data[];560 DECLARE_FLEX_ARRAY(u8, resp_data);
561 DECLARE_FLEX_ARRAY(u8, sense_data);
562 };
559} __attribute__ ((packed));563} __attribute__ ((packed));
560 564
561struct ssp_command_iu {565struct ssp_command_iu {
include/uapi/rdma/rdma_user_rxe.h+2−2
@@ -141,8 +141,8 @@ struct rxe_dma_info { · 140 unmodified lines
141 __u32 sge_offset;141 __u32 sge_offset;
142 __u32 reserved;142 __u32 reserved;
143 union {143 union {
144 __u8 inline_data[0];144 __DECLARE_FLEX_ARRAY(__u8, inline_data);
145 struct rxe_sge sge[0];145 __DECLARE_FLEX_ARRAY(struct rxe_sge, sge);
146 };146 };
147};147};
148 148
include/uapi/sound/asoc.h+2−2
@@ -240,8 +240,8 @@ struct snd_soc_tplg_vendor_array { · 239 unmodified lines
240struct snd_soc_tplg_private {240struct snd_soc_tplg_private {
241 __le32 size; /* in bytes of private data */241 __le32 size; /* in bytes of private data */
242 union {242 union {
243 char data[0];243 __DECLARE_FLEX_ARRAY(char, data);
244 struct snd_soc_tplg_vendor_array array[0];244 __DECLARE_FLEX_ARRAY(struct snd_soc_tplg_vendor_array, array);
245 };245 };
246} __attribute__((packed));246} __attribute__((packed));
247 247