diff mbox

linux-user: fix getrusage and wait4 failures with invalid rusage struct

Message ID 56EA75BA695AE044ACFB41322F6D2BF44CE98E24@BADAG02.ba.imgtec.org
State New
Headers show

Commit Message

Petar Jovanovic May 5, 2014, 9:02 a.m. UTC
ping

http://patchwork.ozlabs.org/patch/337703/

Comments

Riku Voipio May 5, 2014, 12:27 p.m. UTC | #1
Hi,

Thanks, looks good and fixes getrusage02 ltp test.

Added to the linux-user que:

https://git.linaro.org/people/riku.voipio/qemu.git/shortlog/refs/heads/linux-user-for-upstream

Peter, do you prefer a new pull request for linux-user with this patch
added on top, or is pulling the updated branch good enough for you?

Riku


On 5 May 2014 12:02, Petar Jovanovic <Petar.Jovanovic@imgtec.com> wrote:

> ping
>
> http://patchwork.ozlabs.org/patch/337703/
>
> ________________________________________
> From: Petar Jovanovic [petar.jovanovic@rt-rk.com]
> Sent: Tuesday, April 08, 2014 7:24 PM
> To: qemu-devel@nongnu.org
> Cc: Petar Jovanovic; riku.voipio@linaro.org
> Subject: [PATCH] linux-user: fix getrusage and wait4 failures with invalid
> rusage struct
>
> From: Petar Jovanovic <petar.jovanovic@imgtec.com>
>
> Implementations of system calls getrusage and wait4 have not previously
> handled correctly cases when incorrect address of struct rusage is
> passed.
> This change makes sure return values are correctly set for these cases.
>
> Signed-off-by: Petar Jovanovic <petar.jovanovic@imgtec.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 9864813..fc52f0b 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -6309,7 +6309,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long
> arg1,
>              struct rusage rusage;
>              ret = get_errno(getrusage(arg1, &rusage));
>              if (!is_error(ret)) {
> -                host_to_target_rusage(arg2, &rusage);
> +                ret = host_to_target_rusage(arg2, &rusage);
>              }
>          }
>          break;
> @@ -6974,6 +6974,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long
> arg1,
>              abi_long status_ptr = arg2;
>              struct rusage rusage, *rusage_ptr;
>              abi_ulong target_rusage = arg4;
> +            abi_long rusage_err;
>              if (target_rusage)
>                  rusage_ptr = &rusage;
>              else
> @@ -6985,8 +6986,12 @@ abi_long do_syscall(void *cpu_env, int num,
> abi_long arg1,
>                      if (put_user_s32(status, status_ptr))
>                          goto efault;
>                  }
> -                if (target_rusage)
> -                    host_to_target_rusage(target_rusage, &rusage);
> +                if (target_rusage) {
> +                    rusage_err = host_to_target_rusage(target_rusage,
> &rusage);
> +                    if (rusage_err) {
> +                        ret = rusage_err;
> +                    }
> +                }
>              }
>          }
>          break;
> --
> 1.7.9.5
>
>
Peter Maydell May 5, 2014, 12:29 p.m. UTC | #2
On 5 May 2014 13:27, Riku Voipio <riku.voipio@linaro.org> wrote:
> Hi,
>
> Thanks, looks good and fixes getrusage02 ltp test.
>
> Added to the linux-user que:
>
> https://git.linaro.org/people/riku.voipio/qemu.git/shortlog/refs/heads/linux-user-for-upstream
>
> Peter, do you prefer a new pull request for linux-user with this patch added
> on top, or is pulling the updated branch good enough for you?

Send a new cover letter email, then it will go into my folder
of pending requests correctly.

thanks
-- PMM
diff mbox

Patch

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 9864813..fc52f0b 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6309,7 +6309,7 @@  abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
             struct rusage rusage;
             ret = get_errno(getrusage(arg1, &rusage));
             if (!is_error(ret)) {
-                host_to_target_rusage(arg2, &rusage);
+                ret = host_to_target_rusage(arg2, &rusage);
             }
         }
         break;
@@ -6974,6 +6974,7 @@  abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
             abi_long status_ptr = arg2;
             struct rusage rusage, *rusage_ptr;
             abi_ulong target_rusage = arg4;
+            abi_long rusage_err;
             if (target_rusage)
                 rusage_ptr = &rusage;
             else
@@ -6985,8 +6986,12 @@  abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
                     if (put_user_s32(status, status_ptr))
                         goto efault;
                 }
-                if (target_rusage)
-                    host_to_target_rusage(target_rusage, &rusage);
+                if (target_rusage) {
+                    rusage_err = host_to_target_rusage(target_rusage, &rusage);
+                    if (rusage_err) {
+                        ret = rusage_err;
+                    }
+                }
             }
         }
         break;