qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: qemu-devel@nongnu.org
Cc: qemu-s390x@nongnu.org, Riku Voipio <riku.voipio@iki.fi>,
	Laurent Vivier <laurent@vivier.eu>,
	Cornelia Huck <cohuck@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>
Subject: [Qemu-devel] [PULL 02/42] linux-user: Fix getdents emulation for 64 bit guest on 32 bit host
Date: Mon, 30 Apr 2018 11:09:57 +0200	[thread overview]
Message-ID: <20180430091037.13878-3-laurent@vivier.eu> (raw)
In-Reply-To: <20180430091037.13878-1-laurent@vivier.eu>

From: Peter Maydell <peter.maydell@linaro.org>

Currently we mishandle emulation of the getdents syscall for the
case of a 64 bit guest on a 32 bit host -- it defaults into
the 'host and guest same size' codepath and generates incorrect
structures in the guest buffer.

We can't easily handle the 64-on-32 case using the host getdents
syscall, because the guest struct dirent is bigger than the
host struct dirent, and we might find the host syscall has handed
us back more records than we can fit in the guest buffer after
conversion. Instead, always emulate 64-on-32 getdents with
the host getdents64. This avoids the buffer-overrun problem
because a dirent64 struct is always the same size on any host
and always larger than any architecture's dirent struct.

Reported-by: Henry Wertz <hwertz10@gmail.com>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-Id: <20180419125740.2695-1-peter.maydell@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
 linux-user/syscall.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 643b8833de..404be44ad5 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -259,10 +259,22 @@ static int gettid(void) {
     return -ENOSYS;
 }
 #endif
-#if defined(TARGET_NR_getdents) && defined(__NR_getdents)
+
+/* For the 64-bit guest on 32-bit host case we must emulate
+ * getdents using getdents64, because otherwise the host
+ * might hand us back more dirent records than we can fit
+ * into the guest buffer after structure format conversion.
+ * Otherwise we emulate getdents with getdents if the host has it.
+ */
+#if defined(__NR_getdents) && HOST_LONG_BITS >= TARGET_ABI_BITS
+#define EMULATE_GETDENTS_WITH_GETDENTS
+#endif
+
+#if defined(TARGET_NR_getdents) && defined(EMULATE_GETDENTS_WITH_GETDENTS)
 _syscall3(int, sys_getdents, uint, fd, struct linux_dirent *, dirp, uint, count);
 #endif
-#if !defined(__NR_getdents) || \
+#if (defined(TARGET_NR_getdents) && \
+      !defined(EMULATE_GETDENTS_WITH_GETDENTS)) || \
     (defined(TARGET_NR_getdents64) && defined(__NR_getdents64))
 _syscall3(int, sys_getdents64, uint, fd, struct linux_dirent64 *, dirp, uint, count);
 #endif
@@ -10163,7 +10175,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 #endif
 #ifdef TARGET_NR_getdents
     case TARGET_NR_getdents:
-#ifdef __NR_getdents
+#ifdef EMULATE_GETDENTS_WITH_GETDENTS
 #if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
         {
             struct target_dirent *target_dirp;
-- 
2.14.3

  parent reply	other threads:[~2018-04-30  9:11 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-30  9:09 [Qemu-devel] [PULL 00/42] Linux user for 2.13 patches Laurent Vivier
2018-04-30  9:09 ` [Qemu-devel] [PULL 01/42] linux-user: set minimum uname for RISC-V Laurent Vivier
2018-04-30  9:09 ` Laurent Vivier [this message]
2018-04-30  9:09 ` [Qemu-devel] [PULL 03/42] linux-user: create a dummy per arch signal.c Laurent Vivier
2018-04-30  9:09 ` [Qemu-devel] [PULL 04/42] linux-user: move aarch64 signal.c parts to aarch64 directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 05/42] linux-user: move arm signal.c parts to arm directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 06/42] linux-user: move sh4 signal.c parts to sh4 directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 07/42] linux-user: move microblaze signal.c parts to microblaze directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 08/42] linux-user: move cris signal.c parts to cris directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 09/42] linux-user: move nios2 signal.c parts to nios2 directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 10/42] linux-user: move openrisc signal.c parts to openrisc directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 11/42] linux-user: move s390x signal.c parts to s390x directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 12/42] linux-user: move m68k signal.c parts to m68k directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 13/42] linux-user: move alpha signal.c parts to alpha directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 14/42] linux-user: move tilegx signal.c parts to tilegx directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 15/42] linux-user: move riscv signal.c parts to riscv directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 16/42] linux-user: move hppa signal.c parts to hppa directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 17/42] linux-user: move xtensa signal.c parts to xtensa directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 18/42] linux-user: move i386/x86_64 signal.c parts to i386 directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 19/42] linux-user: move sparc/sparc64 signal.c parts to sparc directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 20/42] linux-user: move mips/mips64 signal.c parts to mips directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 21/42] linux-user: move ppc/ppc64 signal.c parts to ppc directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 22/42] linux-user: define TARGET_ARCH_HAS_SETUP_FRAME Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 23/42] linux-user: create a dummy per arch cpu_loop.c Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 24/42] linux-user: move i386/x86_64 cpu loop to i386 directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 25/42] linux-user: move aarch64 cpu loop to aarch64 directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 26/42] linux-user: move arm cpu loop to arm directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 27/42] linux-user: move sparc/sparc64 cpu loop to sparc directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 28/42] linux-user: move ppc/ppc64 cpu loop to ppc directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 29/42] linux-user: move mips/mips64 cpu loop to mips directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 30/42] linux-user: move nios2 cpu loop to nios2 directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 31/42] linux-user: move openrisc cpu loop to openrisc directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 32/42] linux-user: move sh4 cpu loop to sh4 directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 33/42] linux-user: move cris cpu loop to cris directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 34/42] linux-user: move microblaze cpu loop to microblaze directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 35/42] linux-user: move m68k cpu loop to m68k directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 36/42] linux-user: move alpha cpu loop to alpha directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 37/42] linux-user: move s390x cpu loop to s390x directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 38/42] linux-user: move tilegx cpu loop to tilegx directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 39/42] linux-user: move riscv cpu loop to riscv directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 40/42] linux-user: move hppa cpu loop to hppa directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 41/42] linux-user: move xtensa cpu loop to xtensa directory Laurent Vivier
2018-04-30  9:10 ` [Qemu-devel] [PULL 42/42] linux-user: Add ARM get_tls syscall support Laurent Vivier
2018-04-30  9:53 ` [Qemu-devel] [PULL 00/42] Linux user for 2.13 patches no-reply
2018-04-30 11:53 ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180430091037.13878-3-laurent@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=cohuck@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=riku.voipio@iki.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).