qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 6/7] linux-user: Fix syslog


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH v2 6/7] linux-user: Fix syslog
Date: Fri, 16 Dec 2016 14:38:12 +0000

On 24 November 2016 at 16:08, Lena Djokic <address@hidden> 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 <address@hidden>
> ---
>  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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]