mirror_ubuntu-kernels/drivers/net/wireless/intel/ipw2x00
Jacob Keller a23c82e006 wifi: ipw2x00: convert ipw_fw_error->elem to flexible array[]
The ipw_fw_error structure contains a payload[] flexible array as well as
two pointers to this array area, ->elem, and ->log. The total size of the
allocated structure is computed without use of the <linux/overflow.h>
macros.

There's no reason to keep both a payload[] and an extra pointer to both the
elem and log members. Convert the elem pointer member into the flexible
array member, removing payload.

Fix the allocation of the ipw_fw_error structure to use size_add(),
struct_size(), and array_size() to compute the allocation. This ensures
that any overflow saturates at SIZE_MAX rather than overflowing and
potentially allowing an undersized allocation.

Before the structure change, the layout of ipw_fw_error was:

struct ipw_fw_error {
        long unsigned int          jiffies;              /*     0     8 */
        u32                        status;               /*     8     4 */
        u32                        config;               /*    12     4 */
        u32                        elem_len;             /*    16     4 */
        u32                        log_len;              /*    20     4 */
        struct ipw_error_elem *    elem;                 /*    24     8 */
        struct ipw_event *         log;                  /*    32     8 */
        u8                         payload[];            /*    40     0 */

        /* size: 40, cachelines: 1, members: 8 */
        /* last cacheline: 40 bytes */
};

After this change, the layout is now:

struct ipw_fw_error {
        long unsigned int          jiffies;              /*     0     8 */
        u32                        status;               /*     8     4 */
        u32                        config;               /*    12     4 */
        u32                        elem_len;             /*    16     4 */
        u32                        log_len;              /*    20     4 */
        struct ipw_event *         log;                  /*    24     8 */
        struct ipw_error_elem      elem[];               /*    32     0 */

        /* size: 32, cachelines: 1, members: 7 */
        /* last cacheline: 32 bytes */
};

This saves a total of 8 bytes for every ipw_fw_error allocation, and
removes the risk of a potential overflow on the allocation.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Cc: Stanislav Yakovlev <stas.yakovlev@gmail.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230307230148.3735684-1-jacob.e.keller@intel.com
2023-03-13 15:44:15 +02:00
..
ipw2100.c wifi: ipw2x00: Remove some unused functions 2022-12-08 16:42:44 +02:00
ipw2100.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 507 2019-06-19 17:11:23 +02:00
ipw2200.c wifi: ipw2x00: convert ipw_fw_error->elem to flexible array[] 2023-03-13 15:44:15 +02:00
ipw2200.h wifi: ipw2x00: convert ipw_fw_error->elem to flexible array[] 2023-03-13 15:44:15 +02:00
ipw.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
Kconfig net: wireless: drop bogus CRYPTO_xxx Kconfig selects 2020-09-11 14:39:16 +10:00
libipw_geo.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 507 2019-06-19 17:11:23 +02:00
libipw_module.c proc: convert everything to "struct proc_ops" 2020-02-04 03:05:26 +00:00
libipw_rx.c wifi: ipw2x00: fix array of flexible structures warnings 2022-09-22 09:08:52 +03:00
libipw_tx.c ipw2x00: Fix potential NULL dereference in libipw_xmit() 2022-04-06 15:14:44 +03:00
libipw_wx.c ipw2x00: potential buffer overflow in libipw_wx_set_encodeext() 2021-04-17 20:35:44 +03:00
libipw.h wifi: ipw2x00: fix array of flexible structures warnings 2022-09-22 09:08:52 +03:00
Makefile