diff mbox

[v2,6/7] linux-user: Fix syslog

Message ID 1480003738-8754-7-git-send-email-Lena.Djokic@rt-rk.com
State New
Headers show

Commit Message

Lena Djokic Nov. 24, 2016, 4:08 p.m. UTC
Third argument represents lenght not second.
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.

Signed-off-by: Lena Djokic <Lena.Djokic@rt-rk.com>
---
 linux-user/syscall.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

Comments

Peter Maydell Dec. 16, 2016, 2:38 p.m. UTC | #1
On 24 November 2016 at 16:08, Lena Djokic <Lena.Djokic@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.Djokic@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
diff mbox

Patch

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);