Message ID | 20200724064509.331-13-alex.bennee@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | candidate fixes for 5.1-rc1 (testing, semihosting, OOM tcg, x86 fpu) | expand |
On 7/23/20 11:45 PM, Alex Bennée wrote: > From: Laurent Vivier <laurent@vivier.eu> > > If the call is interrupted by a signal handler, it fails with error EINTR > and if "remain" is not NULL and "flags" is not TIMER_ABSTIME, it returns > the remaining unslept time in "remain". > > Update linux-user to not overwrite the "remain" structure if there is no > error. > > Found with "make check-tcg", linux-test fails on nanosleep test: > > TEST linux-test on x86_64 > .../tests/tcg/multiarch/linux-test.c:242: nanosleep > > Reported-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > Signed-off-by: Laurent Vivier <laurent@vivier.eu> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > Message-Id: <20200722174612.2917566-2-laurent@vivier.eu> > --- > linux-user/syscall.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 1211e759c26..43a6e283961 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -11831,8 +11831,14 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, target_to_host_timespec(&ts, arg3); ret = get_errno(safe_clock_nanosleep(arg1, arg2, &ts, arg4 ? &ts : NULL)); - if (arg4) + /* + * if the call is interrupted by a signal handler, it fails + * 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 defined(TARGET_PPC) /* clock_nanosleep is odd in that it returns positive errno values.