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. thanks -- PMM