Re: [PATCH] ALSA: asihpi: avoid write overflow check warning

From: Takashi Iwai

Date: Wed Mar 18 2026 - 07:54:31 EST


On Wed, 18 Mar 2026 11:50:08 +0100,
Arnd Bergmann wrote:
>
> From: Arnd Bergmann <arnd@xxxxxxxx>
>
> 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@xxxxxxxx>
> ---
> sound/pci/asihpi/hpimsgx.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/sound/pci/asihpi/hpimsgx.c b/sound/pci/asihpi/hpimsgx.c
> index b68e6bfbbfba..432a5b787a2a 100644
> --- a/sound/pci/asihpi/hpimsgx.c
> +++ b/sound/pci/asihpi/hpimsgx.c
> @@ -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.s,
> + sizeof(rESP_HPI_ADAPTER_OPEN[adapter].a));

I think the last one is still a bit confusing as if doing an overflow
copy again: hr.u.s is struct hpi_subsys_res which is smaller than
rESP_HPI_ADAPTER_OPEN[adapter].a which is struct hpi_adapter_res.

If any, the last one should be

memcpy(&rESP_HPI_ADAPTER_OPEN[adapter].a, &hr.u.ax.info,
sizeof(rESP_HPI_ADAPTER_OPEN[adapter].a));

Or it could be even

rESP_HPI_ADAPTER_OPEN[adapter].a = hr.u.ax.info;

(I'm not sure which one can be a better result, though.)


thanks,

Takashi