On 24 November 2016 at 16:08, Lena Djokic <lena.djo...@rt-rk.com> wrote: > Third argument represents lenght not second.
typo: "length" > If second 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 second argument. Looking at the kernel code, it doesn't support NULL as the second argument for the three actions here (READ, READ_CLEAR, READ_ALL) -- they all fail EINVAL. So what we're doing here is just returning a better errno. I think we can do this more simply by just changing the current if (len < 0) { goto fail; } to "if (!arg2 || len < 0) {" (which is what the kernel code does). (I think it would also be reasonable to consistently use "len" and never "arg3" (the existing code has an odd mix of both); if you want to do that cleanup you could add an extra patch for it, but you don't have to.) > Signed-off-by: Lena Djokic <lena.djo...@rt-rk.com> > --- > linux-user/syscall.c | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 61c4126..3faf4f0 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -9426,7 +9426,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long > arg1, > #if defined(TARGET_NR_syslog) > case TARGET_NR_syslog: > { > - int len = arg2; > + int len = arg3; > > switch (arg1) { > case TARGET_SYSLOG_ACTION_CLOSE: /* Close log */ > @@ -9450,13 +9450,13 @@ abi_long do_syscall(void *cpu_env, int num, abi_long > arg1, > goto fail; > } > ret = 0; > - if (len == 0) { > - break; > - } > - p = lock_user(VERIFY_WRITE, arg2, arg3, 0); > - if (!p) { > - ret = -TARGET_EFAULT; > - goto fail; > + p = NULL; > + if (arg2) { > + p = lock_user(VERIFY_WRITE, arg2, arg3, 0); > + if (!p) { > + ret = -TARGET_EFAULT; > + goto fail; > + } > } > ret = get_errno(sys_syslog((int)arg1, p, (int)arg3)); > unlock_user(p, arg2, arg3); > -- > 2.7.4 thanks -- PMM