qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]