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: Kees Cook <keescook@chromium.org>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
__le16 auth_transaction;
__le16 status_code;
/* possibly followed by Challenge text */
__le16 auth_transaction;
__le16 status_code;
/* possibly followed by Challenge text */
} __packed __aligned(4) auth;
struct {
__le16 reason_code;
} __packed __aligned(4) auth;
struct {
__le16 reason_code;
__le16 capab_info;
__le16 listen_interval;
/* followed by SSID and Supported rates */
__le16 capab_info;
__le16 listen_interval;
/* followed by SSID and Supported rates */
} __packed __aligned(4) assoc_req;
struct {
__le16 capab_info;
__le16 status_code;
__le16 aid;
/* followed by Supported rates */
} __packed __aligned(4) assoc_req;
struct {
__le16 capab_info;
__le16 status_code;
__le16 aid;
/* followed by Supported rates */
} __packed __aligned(4) assoc_resp, reassoc_resp;
struct {
__le16 capab_info;
__le16 status_code;
} __packed __aligned(4) assoc_resp, reassoc_resp;
struct {
__le16 capab_info;
__le16 status_code;
} __packed __aligned(4) s1g_assoc_resp, s1g_reassoc_resp;
struct {
__le16 capab_info;
__le16 listen_interval;
u8 current_ap[6];
/* followed by SSID and Supported rates */
} __packed __aligned(4) s1g_assoc_resp, s1g_reassoc_resp;
struct {
__le16 capab_info;
__le16 listen_interval;
u8 current_ap[6];
/* followed by SSID and Supported rates */
} __packed __aligned(4) reassoc_req;
struct {
__le16 reason_code;
} __packed __aligned(4) reassoc_req;
struct {
__le16 reason_code;
__le16 capab_info;
/* followed by some of SSID, Supported rates,
* FH Params, DS Params, CF Params, IBSS Params, TIM */
__le16 capab_info;
/* followed by some of SSID, Supported rates,
* FH Params, DS Params, CF Params, IBSS Params, TIM */
} __packed __aligned(4) beacon;
struct {
/* only variable items: SSID, Supported rates */
} __packed __aligned(4) beacon;
struct {
/* only variable items: SSID, Supported rates */
+ DECLARE_FLEX_ARRAY(u8, variable);
} __packed __aligned(4) probe_req;
struct {
__le64 timestamp;
} __packed __aligned(4) probe_req;
struct {
__le64 timestamp;
__le16 capab_info;
/* followed by some of SSID, Supported rates,
* FH Params, DS Params, CF Params, IBSS Params */
__le16 capab_info;
/* followed by some of SSID, Supported rates,
* FH Params, DS Params, CF Params, IBSS Params */
} __packed __aligned(4) probe_resp;
struct {
u8 category;
} __packed __aligned(4) probe_resp;
struct {
u8 category;
u8 action_code;
u8 dialog_token;
u8 status_code;
u8 action_code;
u8 dialog_token;
u8 status_code;
} __packed wme_action;
struct{
u8 action_code;
} __packed wme_action;
struct{
u8 action_code;
} __packed chan_switch;
struct{
u8 action_code;
struct ieee80211_ext_chansw_ie data;
} __packed chan_switch;
struct{
u8 action_code;
struct ieee80211_ext_chansw_ie data;
} __packed ext_chan_switch;
struct{
u8 action_code;
} __packed ext_chan_switch;
struct{
u8 action_code;
__le16 timeout;
__le16 start_seq_num;
/* followed by BA Extension */
__le16 timeout;
__le16 start_seq_num;
/* followed by BA Extension */
} __packed addba_req;
struct{
u8 action_code;
} __packed addba_req;
struct{
u8 action_code;
} __packed delba;
struct {
u8 action_code;
} __packed delba;
struct {
u8 action_code;
} __packed self_prot;
struct{
u8 action_code;
} __packed self_prot;
struct{
u8 action_code;
} __packed mesh_action;
struct {
u8 action;
} __packed mesh_action;
struct {
u8 action;
u8 toa[6];
__le16 tod_error;
__le16 toa_error;
u8 toa[6];
__le16 tod_error;
__le16 toa_error;
} __packed ftm;
struct {
u8 action_code;
} __packed ftm;
struct {
u8 action_code;