• Gustavo A. R. Silva's avatar
    Bluetooth: L2CAP: Avoid -Wflex-array-member-not-at-end warnings · 1c08108f
    Gustavo A. R. Silva authored
    -Wflex-array-member-not-at-end is coming in GCC-14, and we are getting
    ready to enable it globally.
    
    There are currently a couple of objects (`req` and `rsp`), in a couple
    of structures, that contain flexible structures (`struct l2cap_ecred_conn_req`
    and `struct l2cap_ecred_conn_rsp`), for example:
    
    struct l2cap_ecred_rsp_data {
            struct {
                    struct l2cap_ecred_conn_rsp rsp;
                    __le16 scid[L2CAP_ECRED_MAX_CID];
            } __packed pdu;
            int count;
    };
    
    in the struct above, `struct l2cap_ecred_conn_rsp` is a flexible
    structure:
    
    struct l2cap_ecred_conn_rsp {
            __le16 mtu;
            __le16 mps;
            __le16 credits;
            __le16 result;
            __le16 dcid[];
    };
    
    So, in order to avoid ending up with a flexible-array member in the
    middle of another structure, we use the `struct_group_tagged()` (and
    `__struct_group()` when the flexible structure is `__packed`) helper
    to separate the flexible array from the rest of the members in the
    flexible structure:
    
    struct l2cap_ecred_conn_rsp {
            struct_group_tagged(l2cap_ecred_conn_rsp_hdr, hdr,
    
    	... the rest of members
    
            );
            __le16 dcid[];
    };
    
    With the change described above, we now declare objects of the type of
    the tagged struct, in this example `struct l2cap_ecred_conn_rsp_hdr`,
    without embedding flexible arrays in the middle of other structures:
    
    struct l2cap_ecred_rsp_data {
            struct {
                    struct l2cap_ecred_conn_rsp_hdr rsp;
                    __le16 scid[L2CAP_ECRED_MAX_CID];
            } __packed pdu;
            int count;
    };
    
    Also, when the flexible-array member needs to be accessed, we use
    `container_of()` to retrieve a pointer to the flexible structure.
    
    We also use the `DEFINE_RAW_FLEX()` helper for a couple of on-stack
    definitions of a flexible structure where the size of the flexible-array
    member is known at compile-time.
    
    So, with these changes, fix the following warnings:
    net/bluetooth/l2cap_core.c:1260:45: warning: structure containing a
    flexible array member is not at the end of another structure
    [-Wflex-array-member-not-at-end]
    net/bluetooth/l2cap_core.c:3740:45: warning: structure containing a
    flexible array member is not at the end of another structure
    [-Wflex-array-member-not-at-end]
    net/bluetooth/l2cap_core.c:4999:45: warning: structure containing a
    flexible array member is not at the end of another structure
    [-Wflex-array-member-not-at-end]
    net/bluetooth/l2cap_core.c:7116:47: warning: structure containing a
    flexible array member is not at the end of another structure
    [-Wflex-array-member-not-at-end]
    
    Link: https://github.com/KSPP/linux/issues/202Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
    1c08108f
l2cap.h 23.5 KB