All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] linux-user/syscall: Fix do_ioctl_ifconf() for 64 bit targets.
@ 2021-01-09 18:59 Stefan
  2021-01-17 13:00 ` Stefan
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Stefan @ 2021-01-09 18:59 UTC (permalink / raw)
  To: qemu-devel, qemu-trivial; +Cc: Laurent Vivier, qemu-stable

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-guix@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;
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-02-13 19:24 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-09 18:59 [PATCH 1/1] linux-user/syscall: Fix do_ioctl_ifconf() for 64 bit targets Stefan
2021-01-17 13:00 ` Stefan
2021-01-18 14:03 ` Laurent Vivier
2021-01-18 20:18   ` Stefan
2021-02-06 14:11     ` Stefan
2021-02-13 19:07 ` Laurent Vivier
2021-02-13 19:22 ` Laurent Vivier

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.