On 24 November 2016 at 16:08, Lena Djokic <lena.djo...@rt-rk.com> wrote: > If fourth argument is NULL it should be passed without > using lock_user function which would, in that case, return > EFAULT, and system call supports passing NULL as fourth argument. > > Signed-off-by: Lena Djokic <lena.djo...@rt-rk.com> > --- > linux-user/syscall.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 3faf4f0..dad03e9 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -11694,17 +11694,22 @@ abi_long do_syscall(void *cpu_env, int num, > abi_long arg1, > case TARGET_NR_mq_open: > { > struct mq_attr posix_mq_attr; > + struct mq_attr *pposix_mq_attr; > int host_flags; > > host_flags = target_to_host_bitmask(arg2, fcntl_flags_tbl); > - if (copy_from_user_mq_attr(&posix_mq_attr, arg4) != 0) { > - goto efault; > + pposix_mq_attr = NULL; > + if (arg4) { > + if (copy_from_user_mq_attr(&posix_mq_attr, arg4) != 0) { > + goto efault; > + } > + pposix_mq_attr = &posix_mq_attr; > } > p = lock_user_string(arg1 - 1); > if (!p) { > goto efault; > } > - ret = get_errno(mq_open(p, host_flags, arg3, &posix_mq_attr)); > + ret = get_errno(mq_open(p, host_flags, arg3, pposix_mq_attr)); > unlock_user (p, arg1, 0); > } > break; > -- > 2.7.4
Reviewed-by: Peter Maydell <peter.mayd...@linaro.org> thanks -- PMM