From e2af3eadc09b3672017c650e0abfd29a08521921 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Fri, 24 Apr 2026 17:21:01 +0200 Subject: [PATCH] linux-user: Use abi_int for imr_ifindex in ip_mreqn struct Peter Hartley noticed, that in the qemu code the imr_ifindex member of struct target_ip_mreq needs to be of type "int" instead of "long", which is what the Linux kernel uses on all architectures. Adjust the type accordingly, and add a QEMU_BUILD_BUG_ON() checker to prevent such issues in the future. This change should fix multicast issues when using hosts and guests with different endianess or bit size. Reported-by: Peter Hartley Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/2553 Signed-off-by: Helge Deller --- linux-user/syscall.c | 2 ++ linux-user/syscall_defs.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 910a4da0a6..4594909242 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -2161,6 +2161,8 @@ static abi_long do_setsockopt(int sockfd, int level, int optname, QEMU_BUILD_BUG_ON(sizeof(struct ip_mreq) != sizeof(struct target_ip_mreq)); + QEMU_BUILD_BUG_ON(sizeof(struct ip_mreqn) != + sizeof(struct target_ip_mreqn)); if (optname == IP_MULTICAST_IF) { min_size = sizeof(struct in_addr); diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 6967306be4..5799769f83 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -210,7 +210,7 @@ struct target_ip_mreq { struct target_ip_mreqn { struct target_in_addr imr_multiaddr; struct target_in_addr imr_address; - abi_long imr_ifindex; + abi_int imr_ifindex; }; struct target_ip_mreq_source {