________________________________________ From: Peter Maydell [peter.mayd...@linaro.org] 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 <petar.jovano...@rt-rk.com> wrote: > From: Petar Jovanovic <petar.jovano...@imgtec.com> > > 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 <petar.jovano...@imgtec.com> > --- > 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