From: Timothy E Baldwin Date: Fri, 27 May 2016 14:51:55 +0000 (+0100) Subject: linux-user: pause() should not pause if signal pending X-Git-Tag: v2.7.0-rc0~137^2~26 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f59ec606104ade2443179231fc7a3cb98683ac85;p=thirdparty%2Fqemu.git linux-user: pause() should not pause if signal pending Fix races between signal handling and the pause syscall by reimplementing it using block_signals() and sigsuspend(). (Using safe_syscall(pause) would also work, except that the pause syscall doesn't exist on all architectures.) Signed-off-by: Timothy Edward Baldwin Message-id: 1441497448-32489-28-git-send-email-T.E.Baldwin99@members.leeds.ac.uk [PMM: tweaked commit message] Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell Signed-off-by: Riku Voipio --- diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 639b328c74c..aa5517c8499 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -7059,7 +7059,10 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, #endif #ifdef TARGET_NR_pause /* not on alpha */ case TARGET_NR_pause: - ret = get_errno(pause()); + if (!block_signals()) { + sigsuspend(&((TaskState *)cpu->opaque)->signal_mask); + } + ret = -TARGET_EINTR; break; #endif #ifdef TARGET_NR_utime