diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2018-04-19 13:57:40 +0100 |
---|---|---|
committer | Laurent Vivier <laurent@vivier.eu> | 2018-04-30 09:47:46 +0200 |
commit | 2b3f64cbf3e00f5042d120b4c23ed66078431f8c (patch) | |
tree | 01f38276652ececd2bf13313deadf673f46a8f29 /linux-user/signal.c | |
parent | b02ebad1dc3132672a2a1ade2997c78441947e77 (diff) | |
download | qemu-2b3f64cbf3e00f5042d120b4c23ed66078431f8c.zip qemu-2b3f64cbf3e00f5042d120b4c23ed66078431f8c.tar.gz qemu-2b3f64cbf3e00f5042d120b4c23ed66078431f8c.tar.bz2 |
linux-user: Fix getdents emulation for 64 bit guest on 32 bit host
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>
Diffstat (limited to 'linux-user/signal.c')
0 files changed, 0 insertions, 0 deletions