linux-user: translate signal number on return from sigtimedwait

On success, sigtimedwait() returns a signal number that needs to be
translated from a host value to a target value.

This change also fixes issues with sigwait (that is implemented using
sigtimedwait()).

Signed-off-by: Petar Jovanovic <petar.jovanovic@imgtec.com>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Petar Jovanovic 2014-03-03 15:07:41 +01:00 committed by Riku Voipio
parent f19e00d776
commit 974a196d7f

View File

@ -6185,11 +6185,17 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
puts = NULL; puts = NULL;
} }
ret = get_errno(sigtimedwait(&set, &uinfo, puts)); ret = get_errno(sigtimedwait(&set, &uinfo, puts));
if (!is_error(ret) && arg2) { if (!is_error(ret)) {
if (!(p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t), 0))) if (arg2) {
goto efault; p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t),
host_to_target_siginfo(p, &uinfo); 0);
unlock_user(p, arg2, sizeof(target_siginfo_t)); if (!p) {
goto efault;
}
host_to_target_siginfo(p, &uinfo);
unlock_user(p, arg2, sizeof(target_siginfo_t));
}
ret = host_to_target_signal(ret);
} }
} }
break; break;