Message ID | 1480003738-8754-8-git-send-email-Lena.Djokic@rt-rk.com |
---|---|
State | New |
Headers | show |
On 24 November 2016 at 16:08, Lena Djokic <Lena.Djokic@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.Djokic@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.maydell@linaro.org> thanks -- PMM
On Thu, Nov 24, 2016 at 05:08:58PM +0100, Lena Djokic 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. Thanks, applied to linux-user > Signed-off-by: Lena Djokic <Lena.Djokic@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 >
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;
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.Djokic@rt-rk.com> --- linux-user/syscall.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)