[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: |
Petar Jovanovic |
Subject: |
Re: [Qemu-devel] [PATCH] linux-user: pass correct host flags to accept4() |
Date: |
Mon, 31 Mar 2014 15:36:29 +0000 |
________________________________________
From: Peter Maydell address@hidden
Sent: Monday, March 31, 2014 5:19 PM
To: Petar Jovanovic
Cc: QEMU Developers; Riku Voipio; Petar Jovanovic
Subject: Re: [Qemu-devel] [PATCH] linux-user: pass correct host flags to
accept4()
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.
I can, though target_to_host_bitmask() does more work/iterration than what
I believe is really needed in this case.
I will send a modified patch nevertheless.
Regards,
Petar