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: Petar Jovanovic <petar.jovanovic@imgtec.com> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
ad6919dc0a
commit
a39fb273bd
@ -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,
|
|||||||
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,
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user