提交 47c66248 编写于 作者: K Kees Cook

treewide: Replace 0-element memcpy() destinations with flexible arrays

The 0-element arrays that are used as memcpy() destinations are actually
flexible arrays. Adjust their structures accordingly so that memcpy()
can better reason able their destination size (i.e. they need to be seen
as "unknown" length rather than "zero").

In some cases, use of the DECLARE_FLEX_ARRAY() helper is needed when a
flexible array is alone in a struct.

Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Kalle Valo <kvalo@codeaurora.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Nilesh Javali <njavali@marvell.com>
Cc: Manish Rangankar <mrangankar@marvell.com>
Cc: GR-QLogic-Storage-Upstream@marvell.com
Cc: "James E.J. Bottomley" <jejb@linux.ibm.com>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Larry Finger <Larry.Finger@lwfinger.net>
Cc: Phillip Potter <phil@philpotter.co.uk>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Florian Schilhabel <florian.c.schilhabel@googlemail.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Cc: Fabio Aiuto <fabioaiuto83@gmail.com>
Cc: Ross Schmidt <ross.schm.dev@gmail.com>
Cc: Marco Cesati <marcocesati@gmail.com>
Cc: ath10k@lists.infradead.org
Cc: linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
Cc: linux-staging@lists.linux.dev
Signed-off-by: NKees Cook <keescook@chromium.org>
上级 fa7845cf
...@@ -109,7 +109,7 @@ struct bmi_cmd { ...@@ -109,7 +109,7 @@ struct bmi_cmd {
struct { struct {
__le32 addr; __le32 addr;
__le32 len; __le32 len;
u8 payload[0]; u8 payload[];
} write_mem; } write_mem;
struct { struct {
__le32 addr; __le32 addr;
...@@ -138,18 +138,18 @@ struct bmi_cmd { ...@@ -138,18 +138,18 @@ struct bmi_cmd {
} rompatch_uninstall; } rompatch_uninstall;
struct { struct {
__le32 count; __le32 count;
__le32 patch_ids[0]; /* length of @count */ __le32 patch_ids[]; /* length of @count */
} rompatch_activate; } rompatch_activate;
struct { struct {
__le32 count; __le32 count;
__le32 patch_ids[0]; /* length of @count */ __le32 patch_ids[]; /* length of @count */
} rompatch_deactivate; } rompatch_deactivate;
struct { struct {
__le32 addr; __le32 addr;
} lz_start; } lz_start;
struct { struct {
__le32 len; /* max BMI_MAX_DATA_SIZE */ __le32 len; /* max BMI_MAX_DATA_SIZE */
u8 payload[0]; /* length of @len */ u8 payload[]; /* length of @len */
} lz_data; } lz_data;
struct { struct {
u8 name[BMI_NVRAM_SEG_NAME_SZ]; u8 name[BMI_NVRAM_SEG_NAME_SZ];
...@@ -160,7 +160,7 @@ struct bmi_cmd { ...@@ -160,7 +160,7 @@ struct bmi_cmd {
union bmi_resp { union bmi_resp {
struct { struct {
u8 payload[0]; DECLARE_FLEX_ARRAY(u8, payload);
} read_mem; } read_mem;
struct { struct {
__le32 result; __le32 result;
......
...@@ -366,13 +366,13 @@ struct qla4_work_evt { ...@@ -366,13 +366,13 @@ struct qla4_work_evt {
struct { struct {
enum iscsi_host_event_code code; enum iscsi_host_event_code code;
uint32_t data_size; uint32_t data_size;
uint8_t data[0]; uint8_t data[];
} aen; } aen;
struct { struct {
uint32_t status; uint32_t status;
uint32_t pid; uint32_t pid;
uint32_t data_size; uint32_t data_size;
uint8_t data[0]; uint8_t data[];
} ping; } ping;
} u; } u;
}; };
......
...@@ -185,7 +185,7 @@ struct ieee_param { ...@@ -185,7 +185,7 @@ struct ieee_param {
struct { struct {
u32 len; u32 len;
u8 reserved[32]; u8 reserved[32];
u8 data[0]; u8 data[];
} wpa_ie; } wpa_ie;
struct { struct {
int command; int command;
...@@ -198,7 +198,7 @@ struct ieee_param { ...@@ -198,7 +198,7 @@ struct ieee_param {
u8 idx; u8 idx;
u8 seq[8]; /* sequence counter (set: RX, get: TX) */ u8 seq[8]; /* sequence counter (set: RX, get: TX) */
u16 key_len; u16 key_len;
u8 key[0]; u8 key[];
} crypt; } crypt;
#ifdef CONFIG_88EU_AP_MODE #ifdef CONFIG_88EU_AP_MODE
struct { struct {
...@@ -210,7 +210,7 @@ struct ieee_param { ...@@ -210,7 +210,7 @@ struct ieee_param {
} add_sta; } add_sta;
struct { struct {
u8 reserved[2];/* for set max_num_sta */ u8 reserved[2];/* for set max_num_sta */
u8 buf[0]; u8 buf[];
} bcn_ie; } bcn_ie;
#endif #endif
......
...@@ -78,7 +78,7 @@ struct ieee_param { ...@@ -78,7 +78,7 @@ struct ieee_param {
struct { struct {
u32 len; u32 len;
u8 reserved[32]; u8 reserved[32];
u8 data[0]; u8 data[];
} wpa_ie; } wpa_ie;
struct { struct {
int command; int command;
...@@ -91,7 +91,7 @@ struct ieee_param { ...@@ -91,7 +91,7 @@ struct ieee_param {
u8 idx; u8 idx;
u8 seq[8]; /* sequence counter (set: RX, get: TX) */ u8 seq[8]; /* sequence counter (set: RX, get: TX) */
u16 key_len; u16 key_len;
u8 key[0]; u8 key[];
} crypt; } crypt;
} u; } u;
}; };
......
...@@ -172,7 +172,7 @@ struct ieee_param { ...@@ -172,7 +172,7 @@ struct ieee_param {
struct { struct {
u32 len; u32 len;
u8 reserved[32]; u8 reserved[32];
u8 data[0]; u8 data[];
} wpa_ie; } wpa_ie;
struct{ struct{
int command; int command;
...@@ -185,7 +185,7 @@ struct ieee_param { ...@@ -185,7 +185,7 @@ struct ieee_param {
u8 idx; u8 idx;
u8 seq[8]; /* sequence counter (set: RX, get: TX) */ u8 seq[8]; /* sequence counter (set: RX, get: TX) */
u16 key_len; u16 key_len;
u8 key[0]; u8 key[];
} crypt; } crypt;
struct { struct {
u16 aid; u16 aid;
...@@ -196,7 +196,7 @@ struct ieee_param { ...@@ -196,7 +196,7 @@ struct ieee_param {
} add_sta; } add_sta;
struct { struct {
u8 reserved[2];/* for set max_num_sta */ u8 reserved[2];/* for set max_num_sta */
u8 buf[0]; u8 buf[];
} bcn_ie; } bcn_ie;
} u; } u;
}; };
......
...@@ -1143,7 +1143,7 @@ struct ieee80211_mgmt { ...@@ -1143,7 +1143,7 @@ struct ieee80211_mgmt {
__le16 auth_transaction; __le16 auth_transaction;
__le16 status_code; __le16 status_code;
/* possibly followed by Challenge text */ /* possibly followed by Challenge text */
u8 variable[0]; u8 variable[];
} __packed auth; } __packed auth;
struct { struct {
__le16 reason_code; __le16 reason_code;
...@@ -1152,26 +1152,26 @@ struct ieee80211_mgmt { ...@@ -1152,26 +1152,26 @@ struct ieee80211_mgmt {
__le16 capab_info; __le16 capab_info;
__le16 listen_interval; __le16 listen_interval;
/* followed by SSID and Supported rates */ /* followed by SSID and Supported rates */
u8 variable[0]; u8 variable[];
} __packed assoc_req; } __packed assoc_req;
struct { struct {
__le16 capab_info; __le16 capab_info;
__le16 status_code; __le16 status_code;
__le16 aid; __le16 aid;
/* followed by Supported rates */ /* followed by Supported rates */
u8 variable[0]; u8 variable[];
} __packed assoc_resp, reassoc_resp; } __packed assoc_resp, reassoc_resp;
struct { struct {
__le16 capab_info; __le16 capab_info;
__le16 status_code; __le16 status_code;
u8 variable[0]; u8 variable[];
} __packed s1g_assoc_resp, s1g_reassoc_resp; } __packed s1g_assoc_resp, s1g_reassoc_resp;
struct { struct {
__le16 capab_info; __le16 capab_info;
__le16 listen_interval; __le16 listen_interval;
u8 current_ap[ETH_ALEN]; u8 current_ap[ETH_ALEN];
/* followed by SSID and Supported rates */ /* followed by SSID and Supported rates */
u8 variable[0]; u8 variable[];
} __packed reassoc_req; } __packed reassoc_req;
struct { struct {
__le16 reason_code; __le16 reason_code;
...@@ -1182,11 +1182,11 @@ struct ieee80211_mgmt { ...@@ -1182,11 +1182,11 @@ struct ieee80211_mgmt {
__le16 capab_info; __le16 capab_info;
/* followed by some of SSID, Supported rates, /* followed by some of SSID, Supported rates,
* FH Params, DS Params, CF Params, IBSS Params, TIM */ * FH Params, DS Params, CF Params, IBSS Params, TIM */
u8 variable[0]; u8 variable[];
} __packed beacon; } __packed beacon;
struct { struct {
/* only variable items: SSID, Supported rates */ /* only variable items: SSID, Supported rates */
u8 variable[0]; DECLARE_FLEX_ARRAY(u8, variable);
} __packed probe_req; } __packed probe_req;
struct { struct {
__le64 timestamp; __le64 timestamp;
...@@ -1194,7 +1194,7 @@ struct ieee80211_mgmt { ...@@ -1194,7 +1194,7 @@ struct ieee80211_mgmt {
__le16 capab_info; __le16 capab_info;
/* followed by some of SSID, Supported rates, /* followed by some of SSID, Supported rates,
* FH Params, DS Params, CF Params, IBSS Params */ * FH Params, DS Params, CF Params, IBSS Params */
u8 variable[0]; u8 variable[];
} __packed probe_resp; } __packed probe_resp;
struct { struct {
u8 category; u8 category;
...@@ -1203,16 +1203,16 @@ struct ieee80211_mgmt { ...@@ -1203,16 +1203,16 @@ struct ieee80211_mgmt {
u8 action_code; u8 action_code;
u8 dialog_token; u8 dialog_token;
u8 status_code; u8 status_code;
u8 variable[0]; u8 variable[];
} __packed wme_action; } __packed wme_action;
struct{ struct{
u8 action_code; u8 action_code;
u8 variable[0]; u8 variable[];
} __packed chan_switch; } __packed chan_switch;
struct{ struct{
u8 action_code; u8 action_code;
struct ieee80211_ext_chansw_ie data; struct ieee80211_ext_chansw_ie data;
u8 variable[0]; u8 variable[];
} __packed ext_chan_switch; } __packed ext_chan_switch;
struct{ struct{
u8 action_code; u8 action_code;
...@@ -1228,7 +1228,7 @@ struct ieee80211_mgmt { ...@@ -1228,7 +1228,7 @@ struct ieee80211_mgmt {
__le16 timeout; __le16 timeout;
__le16 start_seq_num; __le16 start_seq_num;
/* followed by BA Extension */ /* followed by BA Extension */
u8 variable[0]; u8 variable[];
} __packed addba_req; } __packed addba_req;
struct{ struct{
u8 action_code; u8 action_code;
...@@ -1244,11 +1244,11 @@ struct ieee80211_mgmt { ...@@ -1244,11 +1244,11 @@ struct ieee80211_mgmt {
} __packed delba; } __packed delba;
struct { struct {
u8 action_code; u8 action_code;
u8 variable[0]; u8 variable[];
} __packed self_prot; } __packed self_prot;
struct{ struct{
u8 action_code; u8 action_code;
u8 variable[0]; u8 variable[];
} __packed mesh_action; } __packed mesh_action;
struct { struct {
u8 action; u8 action;
...@@ -1292,7 +1292,7 @@ struct ieee80211_mgmt { ...@@ -1292,7 +1292,7 @@ struct ieee80211_mgmt {
u8 toa[6]; u8 toa[6];
__le16 tod_error; __le16 tod_error;
__le16 toa_error; __le16 toa_error;
u8 variable[0]; u8 variable[];
} __packed ftm; } __packed ftm;
struct { struct {
u8 action_code; u8 action_code;
......
...@@ -45,13 +45,13 @@ struct dlm_lock_params { ...@@ -45,13 +45,13 @@ struct dlm_lock_params {
void __user *bastaddr; void __user *bastaddr;
struct dlm_lksb __user *lksb; struct dlm_lksb __user *lksb;
char lvb[DLM_USER_LVB_LEN]; char lvb[DLM_USER_LVB_LEN];
char name[0]; char name[];
}; };
struct dlm_lspace_params { struct dlm_lspace_params {
__u32 flags; __u32 flags;
__u32 minor; __u32 minor;
char name[0]; char name[];
}; };
struct dlm_purge_params { struct dlm_purge_params {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册