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]; | ^~~~~~~
Unified · Split
| @@ -222,8 +222,10 @@ struct chcr_authenc_ctx { · 221 unmodified lines | |||
| 222 | }; | 222 | }; |
| 223 | 223 | ||
| 224 | struct __aead_ctx { | 224 | struct __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 | ||
| 229 | struct chcr_aead_ctx { | 231 | struct chcr_aead_ctx { |
| @@ -245,9 +247,11 @@ struct hmac_ctx { · 15 unmodified lines | |||
| 245 | }; | 247 | }; |
| 246 | 248 | ||
| 247 | struct __crypto_ctx { | 249 | struct __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 | ||
| 253 | struct chcr_context { | 257 | struct chcr_context { |
| @@ -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; |
| @@ -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; |
| @@ -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 | ||
| 1681 | static inline void * | 1684 | static inline void * |
| @@ -1408,8 +1408,10 @@ struct il3945_tx_cmd { · 1407 unmodified lines | |||
| 1408 | * MAC header goes here, followed by 2 bytes padding if MAC header | 1408 | * MAC header goes here, followed by 2 bytes padding if MAC header |
| 1409 | * length is 26 or 30 bytes, followed by payload data | 1409 | * 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 | /* |
| @@ -1251,8 +1251,10 @@ struct iwl_tx_cmd { · 1250 unmodified lines | |||
| 1251 | * MAC header goes here, followed by 2 bytes padding if MAC header | 1251 | * MAC header goes here, followed by 2 bytes padding if MAC header |
| 1252 | * length is 26 or 30 bytes, followed by payload data | 1252 | * 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 | /* |
| @@ -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 | ||
| 246 | struct iwl_dram_sec_info { | 248 | struct 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 | /** |
| @@ -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 | ||
| 524 | struct asd_ctrla_phy_entry { | 526 | struct asd_ctrla_phy_entry { |
| @@ -409,10 +409,10 @@ struct bplus_header · 408 unmodified lines | |||
| 409 | __le16 first_free; /* offset from start of header to | 409 | __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 giving | 412 | /* (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 giving | 414 | /* (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 | ||
| @@ -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 | ||
| 593 | struct sk_filter { | 595 | struct sk_filter { |
| @@ -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 | ||
| 330 | struct ssp_command_iu { | 332 | struct 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 | ||
| 561 | struct ssp_command_iu { | 565 | struct ssp_command_iu { |
| @@ -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 | ||
| @@ -240,8 +240,8 @@ struct snd_soc_tplg_vendor_array { · 239 unmodified lines | |||
| 240 | struct snd_soc_tplg_private { | 240 | struct 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 | ||