提交 a39fb273 编写于 作者: P Petar Jovanovic 提交者: Riku Voipio

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

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: NPetar Jovanovic <petar.jovanovic@imgtec.com>
Signed-off-by: NRiku Voipio <riku.voipio@linaro.org>
上级 ad6919dc
...@@ -6243,7 +6243,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, ...@@ -6243,7 +6243,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
struct rusage rusage; struct rusage rusage;
ret = get_errno(getrusage(arg1, &rusage)); ret = get_errno(getrusage(arg1, &rusage));
if (!is_error(ret)) { if (!is_error(ret)) {
host_to_target_rusage(arg2, &rusage); ret = host_to_target_rusage(arg2, &rusage);
} }
} }
break; break;
...@@ -6908,6 +6908,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, ...@@ -6908,6 +6908,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
abi_long status_ptr = arg2; abi_long status_ptr = arg2;
struct rusage rusage, *rusage_ptr; struct rusage rusage, *rusage_ptr;
abi_ulong target_rusage = arg4; abi_ulong target_rusage = arg4;
abi_long rusage_err;
if (target_rusage) if (target_rusage)
rusage_ptr = &rusage; rusage_ptr = &rusage;
else else
...@@ -6919,8 +6920,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, ...@@ -6919,8 +6920,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
if (put_user_s32(status, status_ptr)) if (put_user_s32(status, status_ptr))
goto efault; goto efault;
} }
if (target_rusage) if (target_rusage) {
host_to_target_rusage(target_rusage, &rusage); rusage_err = host_to_target_rusage(target_rusage, &rusage);
if (rusage_err) {
ret = rusage_err;
}
}
} }
} }
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册