[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 02/18] linux-user: Fix 'clock_nanosleep()' implementation
From: |
Laurent Vivier |
Subject: |
[PULL 02/18] linux-user: Fix 'clock_nanosleep()' implementation |
Date: |
Thu, 27 Aug 2020 21:20:02 +0200 |
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
Implementation of syscall 'clock_nanosleep()' in 'syscall.c' uses
functions 'target_to_host_timespec()' and 'host_to_target_timespec()'
to transfer the value of 'struct timespec' between target and host.
However, the implementation doesn't check whether this conversion
succeeds and thus can return an unaproppriate error instead of 'EFAULT'
that is expected. This was confirmed with the modified LTP test suite
where testcases with bad 'struct timespec' adress for 'clock_nanosleep()'
were added. This modified LTP suite can be found at:
https://github.com/bozutaf/ltp
(Patch with this new test case will be sent to LTP mailing list soon)
Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20200727201326.401519-1-Filip.Bozuta@syrmia.com>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
linux-user/syscall.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 5b3fce3dc0cb..e387246d7196 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -11875,7 +11875,9 @@ static abi_long do_syscall1(void *cpu_env, int num,
abi_long arg1,
case TARGET_NR_clock_nanosleep:
{
struct timespec ts;
- target_to_host_timespec(&ts, arg3);
+ if (target_to_host_timespec(&ts, arg3)) {
+ return -TARGET_EFAULT;
+ }
ret = get_errno(safe_clock_nanosleep(arg1, arg2,
&ts, arg4 ? &ts : NULL));
/*
@@ -11883,8 +11885,9 @@ static abi_long do_syscall1(void *cpu_env, int num,
abi_long arg1,
* with error -TARGET_EINTR and if arg4 is not NULL and arg2 is not
* TIMER_ABSTIME, it returns the remaining unslept time in arg4.
*/
- if (ret == -TARGET_EINTR && arg4 && arg2 != TIMER_ABSTIME) {
- host_to_target_timespec(arg4, &ts);
+ if (ret == -TARGET_EINTR && arg4 && arg2 != TIMER_ABSTIME &&
+ host_to_target_timespec(arg4, &ts)) {
+ return -TARGET_EFAULT;
}
return ret;
--
2.26.2
- [PULL 00/18] Linux user for 5.2 patches, Laurent Vivier, 2020/08/27
- [PULL 01/18] linux-user: Fix 'semop()' and 'semtimedop()' implementation, Laurent Vivier, 2020/08/27
- [PULL 02/18] linux-user: Fix 'clock_nanosleep()' implementation,
Laurent Vivier <=
- [PULL 07/18] linux-user: Add an api to print enumareted argument values with strace, Laurent Vivier, 2020/08/27
- [PULL 03/18] linux-user: syscall: ioctls: support DRM_IOCTL_I915_GETPARAM, Laurent Vivier, 2020/08/27
- [PULL 04/18] linux-user: Make cpu_env accessible in strace.c, Laurent Vivier, 2020/08/27
- [PULL 05/18] linux-user: Add strace support for printing arguments of truncate()/ftruncate() and getsid(), Laurent Vivier, 2020/08/27
- [PULL 09/18] linux-user: Add generic 'termbits.h' for some archs, Laurent Vivier, 2020/08/27
- [PULL 14/18] linux-user: fix target_to_host_timespec64(), Laurent Vivier, 2020/08/27
- [PULL 08/18] linux-user: Add strace support for printing arguments of some clock and time functions, Laurent Vivier, 2020/08/27
- [PULL 06/18] linux-user: Add strace support for printing arguments of syscalls used to lock and unlock memory, Laurent Vivier, 2020/08/27
- [PULL 17/18] linux-user: Add support for 'rt_sigtimedwait_time64()' and 'sched_rr_get_interval_time64()', Laurent Vivier, 2020/08/27
- [PULL 12/18] linux-user: detect mismatched ELF ABI in qemu-mips[n32][el], Laurent Vivier, 2020/08/27