On 25/06/25 10:56, Kees Cook wrote:
On Wed, Jun 11, 2025 at 01:52:41PM -0600, Gustavo A. R. Silva wrote:
-Wflex-array-member-not-at-end was introduced in GCC-14, and we are
getting ready to enable it, globally.

Refactor multiple structs that contain flexible-array members in the
middle by replacing them with unions.

These changes preserve the memory layout while effectively adjusting
it so that the flexible-array member is always treated as the last
member.

With these changes, fix a dozen instances of the following type of
warning:

drivers/acpi/nfit/intel.c:692:35: warning: structure containing a flexible 
array member is not at the end of another structure 
[-Wflex-array-member-not-at-end]

Signed-off-by: Gustavo A. R. Silva <[email protected]>
---
Changes in v3:
  - Use union instead of DEFINE_RAW_FLEX().

I think your TRAILING_OVERLAP macro[1] is perfect here. I'll try to get that
landed for the next rc. Can you double-check that this works correctly
in these cases?

Absolutely. If people prefer that route I'm happy to wait for the helper to
land in linus' tree.


@@ -55,9 +55,16 @@ static unsigned long intel_security_flags(struct nvdimm 
*nvdimm,
  {
        struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
        unsigned long security_flags = 0;
-       struct {
+       /*
+        * This effectively creates a union between the flexible-array member
+        * and any members after _offset_to_fam.
+        */
+       union {
                struct nd_cmd_pkg pkg;
-               struct nd_intel_get_security_state cmd;
+               struct {
+                       u8 _offset_to_fam[offsetof(struct nd_cmd_pkg, 
nd_payload)];
+                       struct nd_intel_get_security_state cmd;
+               };
        } nd_cmd = {
                .pkg = {
                        .nd_command = NVDIMM_INTEL_GET_SECURITY_STATE,

I think it would be a pretty small and direct replacement:

        TRAILING_OVERLAP(struct nd_cmd_pkg, pkg, nd_payload,
                         struct nd_intel_get_security_state cmd;
        ) nd_cmd = {
                ...

Yes, this works. Hopefully, maintainers will comment on this and let us
know what they prefer. :)

Thanks!
-Gustavo


-Kees

[1] 
https://web.git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git/commit/?h=for-next/kspp&id=29bb79e9dbf1ba100125e39deb7147acd490903f



Reply via email to