]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: asihpi: avoid write overflow check warning
authorArnd Bergmann <arnd@arndb.de>
Wed, 18 Mar 2026 12:40:07 +0000 (13:40 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 18 Mar 2026 16:01:17 +0000 (17:01 +0100)
clang-22 rightfully warns that the memcpy() in adapter_prepare() copies
between different structures, crossing the boundary of nested
structures inside it:

In file included from sound/pci/asihpi/hpimsgx.c:13:
In file included from include/linux/string.h:386:
include/linux/fortify-string.h:569:4: error: call to '__write_overflow_field' declared with 'warning' attribute: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror,-Wattribute-warning]
  569 |                         __write_overflow_field(p_size_field, size);

The two structures seem to refer to the same layout, despite the
separate definitions, so the code is in fact correct.

Avoid the warning by copying the two inner structures separately.
I see the same pattern happens in other functions in the same file,
so there is a chance that this may come back in the future, but
this instance is the only one that I saw in practice, hitting it
multiple times per day in randconfig build.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Link: https://patch.msgid.link/20260318124016.3488566-1-arnd@kernel.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/asihpi/hpimsgx.c

index b68e6bfbbfbab51cc46e6c5914518d572cd582de..ed1c7b774436146229470d4d47f375b72b8d4f4f 100644 (file)
@@ -581,8 +581,10 @@ static u16 adapter_prepare(u16 adapter)
                HPI_ADAPTER_OPEN);
        hm.adapter_index = adapter;
        hw_entry_point(&hm, &hr);
-       memcpy(&rESP_HPI_ADAPTER_OPEN[adapter], &hr,
-               sizeof(rESP_HPI_ADAPTER_OPEN[0]));
+       memcpy(&rESP_HPI_ADAPTER_OPEN[adapter].h, &hr,
+               sizeof(rESP_HPI_ADAPTER_OPEN[adapter].h));
+       memcpy(&rESP_HPI_ADAPTER_OPEN[adapter].a, &hr.u.ax.info,
+               sizeof(rESP_HPI_ADAPTER_OPEN[adapter].a));
        if (hr.error)
                return hr.error;