[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] linux-user: pass correct host flags to accept4(
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH] linux-user: pass correct host flags to accept4() |
Date: |
Mon, 31 Mar 2014 16:19:49 +0100 |
On 31 March 2014 16:09, Petar Jovanovic <address@hidden> wrote:
> From: Petar Jovanovic <address@hidden>
>
> Flags NONBLOCK and CLOEXEC can have different values on the host and the
> guest, so set correct host values before calling accept4().
>
> This fixes several issues with accept4 system call and user-mode of QEMU.
>
> Signed-off-by: Petar Jovanovic <address@hidden>
> ---
> linux-user/syscall.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 2eac6d5..3447419 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -2062,9 +2062,18 @@ static abi_long do_accept4(int fd, abi_ulong
> target_addr,
> socklen_t addrlen;
> void *addr;
> abi_long ret;
> + int host_flags;
> +
> + host_flags = flags & (~(TARGET_O_NONBLOCK | TARGET_O_CLOEXEC));
> + if (flags & TARGET_O_NONBLOCK) {
> + host_flags |= O_NONBLOCK;
> + }
> + if (flags & TARGET_O_CLOEXEC) {
> + host_flags |= O_CLOEXEC;
> + }
We have a target_to_host_bitmask() utility for this
kind of thing. I think you can just use
host_flags = target_to_host_bitmask(flags, fcntl_flags_tbl);
and rely on the host kernel to fail EINVAL if the
guest has set any of the other flags that fnctl_flags_tbl
supports.
thanks
-- PMM