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 | 224 | 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 | + }; | |
| 227 | 229 | }; |
| 228 | 230 | |
| 229 | 231 | struct chcr_aead_ctx { |
| @@ -245,9 +247,11 @@ struct hmac_ctx { · 15 unmodified lines | ||
| 245 | 247 | }; |
| 246 | 248 | |
| 247 | 249 | 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 | + }; | |
| 251 | 255 | }; |
| 252 | 256 | |
| 253 | 257 | struct chcr_context { |
| @@ -192,7 +192,7 @@ struct es581_4_urb_cmd { · 191 unmodified lines | ||
| 192 | 192 | struct es581_4_rx_cmd_ret rx_cmd_ret; |
| 193 | 193 | __le64 timestamp; |
| 194 | 194 | u8 rx_cmd_ret_u8; |
| 195 | − u8 raw_msg[0]; | |
| 195 | + DECLARE_FLEX_ARRAY(u8, raw_msg); | |
| 196 | 196 | } __packed; |
| 197 | 197 | |
| 198 | 198 | __le16 reserved_for_crc16_do_not_use; |
| @@ -219,7 +219,7 @@ struct es58x_fd_urb_cmd { · 218 unmodified lines | ||
| 219 | 219 | struct es58x_fd_tx_ack_msg tx_ack_msg; |
| 220 | 220 | __le64 timestamp; |
| 221 | 221 | __le32 rx_cmd_ret_le32; |
| 222 | − u8 raw_msg[0]; | |
| 222 | + DECLARE_FLEX_ARRAY(u8, raw_msg); | |
| 223 | 223 | } __packed; |
| 224 | 224 | |
| 225 | 225 | __le16 reserved_for_crc16_do_not_use; |
| @@ -1674,8 +1674,11 @@ struct htt_tx_fetch_ind { · 1673 unmodified lines | ||
| 1674 | 1674 | __le32 token; |
| 1675 | 1675 | __le16 num_resp_ids; |
| 1676 | 1676 | __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 | + }; | |
| 1679 | 1682 | } __packed; |
| 1680 | 1683 | |
| 1681 | 1684 | static inline void * |
| @@ -1408,8 +1408,10 @@ struct il3945_tx_cmd { · 1407 unmodified lines | ||
| 1408 | 1408 | * MAC header goes here, followed by 2 bytes padding if MAC header |
| 1409 | 1409 | * length is 26 or 30 bytes, followed by payload data |
| 1410 | 1410 | */ |
| 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 | + }; | |
| 1413 | 1415 | } __packed; |
| 1414 | 1416 | |
| 1415 | 1417 | /* |
| @@ -1251,8 +1251,10 @@ struct iwl_tx_cmd { · 1250 unmodified lines | ||
| 1251 | 1251 | * MAC header goes here, followed by 2 bytes padding if MAC header |
| 1252 | 1252 | * length is 26 or 30 bytes, followed by payload data |
| 1253 | 1253 | */ |
| 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 | + }; | |
| 1256 | 1258 | } __packed; |
| 1257 | 1259 | |
| 1258 | 1260 | /* |
| @@ -239,8 +239,10 @@ struct iwl_tx_cmd { · 238 unmodified lines | ||
| 239 | 239 | u8 tid_tspec; |
| 240 | 240 | __le16 pm_frame_timeout; |
| 241 | 241 | __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 | + }; | |
| 244 | 246 | } __packed; /* TX_CMD_API_S_VER_6 */ |
| 245 | 247 | |
| 246 | 248 | struct iwl_dram_sec_info { |
| @@ -713,8 +715,10 @@ struct iwl_mvm_compressed_ba_notif { · 466 unmodified lines | ||
| 713 | 715 | __le32 tx_rate; |
| 714 | 716 | __le16 tfd_cnt; |
| 715 | 717 | __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 | + }; | |
| 718 | 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 | 517 | u8 num_nodes; |
| 518 | 518 | u8 usage_model_id; |
| 519 | 519 | 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 | + }; | |
| 522 | 524 | } __attribute__ ((packed)); |
| 523 | 525 | |
| 524 | 526 | struct asd_ctrla_phy_entry { |
| @@ -409,10 +409,10 @@ struct bplus_header · 408 unmodified lines | ||
| 409 | 409 | __le16 first_free; /* offset from start of header to |
| 410 | 410 | first free node in array */ |
| 411 | 411 | 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); | |
| 416 | 416 | } u; |
| 417 | 417 | }; |
| 418 | 418 | |
| @@ -586,8 +586,10 @@ struct bpf_prog { · 585 unmodified lines | ||
| 586 | 586 | struct bpf_prog_aux *aux; /* Auxiliary fields */ |
| 587 | 587 | struct sock_fprog_kern *orig_prog; /* Original BPF program */ |
| 588 | 588 | /* 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 | + }; | |
| 591 | 593 | }; |
| 592 | 594 | |
| 593 | 595 | struct sk_filter { |
| @@ -323,8 +323,10 @@ struct ssp_response_iu { · 322 unmodified lines | ||
| 323 | 323 | __be32 sense_data_len; |
| 324 | 324 | __be32 response_data_len; |
| 325 | 325 | |
| 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 | + }; | |
| 328 | 330 | } __attribute__ ((packed)); |
| 329 | 331 | |
| 330 | 332 | struct ssp_command_iu { |
| @@ -554,8 +556,10 @@ struct ssp_response_iu { · 223 unmodified lines | ||
| 554 | 556 | __be32 sense_data_len; |
| 555 | 557 | __be32 response_data_len; |
| 556 | 558 | |
| 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 | + }; | |
| 559 | 563 | } __attribute__ ((packed)); |
| 560 | 564 | |
| 561 | 565 | struct ssp_command_iu { |
| @@ -141,8 +141,8 @@ struct rxe_dma_info { · 140 unmodified lines | ||
| 141 | 141 | __u32 sge_offset; |
| 142 | 142 | __u32 reserved; |
| 143 | 143 | 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); | |
| 146 | 146 | }; |
| 147 | 147 | }; |
| 148 | 148 | |
| @@ -240,8 +240,8 @@ struct snd_soc_tplg_vendor_array { · 239 unmodified lines | ||
| 240 | 240 | struct snd_soc_tplg_private { |
| 241 | 241 | __le32 size; /* in bytes of private data */ |
| 242 | 242 | 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); | |
| 245 | 245 | }; |
| 246 | 246 | } __attribute__((packed)); |
| 247 | 247 | |