Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Ayush Sawal <ayush.sawal@chelsio.com>
Cc: Vinay Kumar Yadav <vinay.yadav@chelsio.com>
Cc: Rohit Maheshwari <rohitm@chelsio.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Kalle Valo <kvalo@codeaurora.org>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Stanislaw Gruszka <stf_xl@wp.pl>
Cc: Luca Coelho <luciano.coelho@intel.com>
Cc: "James E.J. Bottomley" <jejb@linux.ibm.com>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Martin KaFai Lau <kafai@fb.com>
Cc: Song Liu <songliubraving@fb.com>
Cc: Yonghong Song <yhs@fb.com>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: KP Singh <kpsingh@kernel.org>
Cc: Johannes Berg <johannes.berg@intel.com>
Cc: Mordechay Goodstein <mordechay.goodstein@intel.com>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Wolfgang Grandegger <wg@grandegger.com>
Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Cc: Arunachalam Santhanam <arunachalam.santhanam@in.bosch.com>
Cc: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Cc: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
Cc: linux-crypto@vger.kernel.org
Cc: ath10k@lists.infradead.org
Cc: linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
Cc: linux-can@vger.kernel.org
Cc: bpf@vger.kernel.org
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de> # drivers/net/can/usb/etas_es58x/*
Signed-off-by: Kees Cook <keescook@chromium.org>

+56 -33
+9 -5
drivers/crypto/chelsio/chcr_crypto.h
··· 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 { ··· 247 245 }; 248 246 249 247 struct __crypto_ctx { 250 - struct hmac_ctx hmacctx[0]; 251 - struct ablk_ctx ablkctx[0]; 252 - struct chcr_aead_ctx aeadctx[]; 248 + union { 249 + DECLARE_FLEX_ARRAY(struct hmac_ctx, hmacctx); 250 + DECLARE_FLEX_ARRAY(struct ablk_ctx, ablkctx); 251 + DECLARE_FLEX_ARRAY(struct chcr_aead_ctx, aeadctx); 252 + }; 253 253 }; 254 254 255 255 struct chcr_context {
+1 -1
drivers/net/can/usb/etas_es58x/es581_4.h
··· 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;
+1 -1
drivers/net/can/usb/etas_es58x/es58x_fd.h
··· 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;
+5 -2
drivers/net/wireless/ath/ath10k/htt.h
··· 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 *
+4 -2
drivers/net/wireless/intel/iwlegacy/commands.h
··· 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 /*
+4 -2
drivers/net/wireless/intel/iwlwifi/dvm/commands.h
··· 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 /*
+8 -4
drivers/net/wireless/intel/iwlwifi/fw/api/tx.h
··· 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 { ··· 715 713 __le32 tx_rate; 716 714 __le16 tfd_cnt; 717 715 __le16 ra_tid_cnt; 718 - struct iwl_mvm_compressed_ba_ratid ra_tid[0]; 719 - struct iwl_mvm_compressed_ba_tfd tfd[]; 716 + union { 717 + DECLARE_FLEX_ARRAY(struct iwl_mvm_compressed_ba_ratid, ra_tid); 718 + DECLARE_FLEX_ARRAY(struct iwl_mvm_compressed_ba_tfd, tfd); 719 + }; 720 720 } __packed; /* COMPRESSED_BA_RES_API_S_VER_4 */ 721 721 722 722 /**
+4 -2
drivers/scsi/aic94xx/aic94xx_sds.c
··· 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 {
+4 -4
fs/hpfs/hpfs.h
··· 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
+4 -2
include/linux/filter.h
··· 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 {
+8 -4
include/scsi/sas.h
··· 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 { ··· 556 554 __be32 sense_data_len; 557 555 __be32 response_data_len; 558 556 559 - u8 resp_data[0]; 560 - u8 sense_data[]; 557 + union { 558 + DECLARE_FLEX_ARRAY(u8, resp_data); 559 + DECLARE_FLEX_ARRAY(u8, sense_data); 560 + }; 561 561 } __attribute__ ((packed)); 562 562 563 563 struct ssp_command_iu {
+2 -2
include/uapi/rdma/rdma_user_rxe.h
··· 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
+2 -2
include/uapi/sound/asoc.h
··· 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