Le 09/01/2021 à 19:59, Stefan a écrit : > The sizeof(struct ifreq) is 40 for 64 bit and 32 for 32 bit architectures. > This structure contains a union of other structures, of which struct ifmap > is the biggest for 64 bit architectures. Calling ioclt(…, SIOCGIFCONF, …) > fills a struct sockaddr of that union, and do_ioctl_ifconf() only considered > that struct sockaddr for the size of the union, which has the same size as > struct ifmap on 32 bit architectures. So do_ioctl_ifconf() assumed a wrong > size of 32 for struct ifreq instead of the correct size of 40 on 64 bit > architectures. > > The fix makes do_ioctl_ifconf() handle struct ifmap as the biggest part of > the union, treating struct ifreq with the correct size. > > Signed-off-by: Stefan <stefan-g...@vodafonemail.de> > --- > linux-user/syscall.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index d182890ff0..15a6abadc1 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -4902,6 +4902,7 @@ static abi_long do_ioctl_ifconf(const IOCTLEntry *ie, > uint8_t *buf_temp, > struct ifconf *host_ifconf; > uint32_t outbufsz; > const argtype ifreq_arg_type[] = { MK_STRUCT(STRUCT_sockaddr_ifreq) }; > + const argtype ifreq_max_type[] = { MK_STRUCT(STRUCT_ifmap_ifreq) }; > int target_ifreq_size; > int nb_ifreq; > int free_buf = 0; > @@ -4925,7 +4926,7 @@ static abi_long do_ioctl_ifconf(const IOCTLEntry *ie, > uint8_t *buf_temp, > > host_ifconf = (struct ifconf *)(unsigned long)buf_temp; > target_ifc_buf = (abi_long)(unsigned long)host_ifconf->ifc_buf; > - target_ifreq_size = thunk_type_size(ifreq_arg_type, 0); > + target_ifreq_size = thunk_type_size(ifreq_max_type, 0); > > if (target_ifc_buf != 0) { > target_ifc_len = host_ifconf->ifc_len; >
Applied to my linux-user-for-6.0 branch. Thanks, Laurent