Message ID | 1464360721-14359-7-git-send-email-peter.maydell@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Le 27/05/2016 à 16:51, Peter Maydell a écrit : > Use the safe_syscall wrapper for sigsuspend syscalls. This > means that we will definitely deliver a signal that arrives > before we do the sigsuspend call, rather than blocking first > and delivering afterwards. > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Laurent Vivier <laurent@vivier.eu> > --- > linux-user/syscall.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index e4b7404..083f26f 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -703,6 +703,7 @@ safe_syscall6(int, pselect6, int, nfds, fd_set *, readfds, fd_set *, writefds, \ > fd_set *, exceptfds, struct timespec *, timeout, void *, sig) > safe_syscall6(int,futex,int *,uaddr,int,op,int,val, \ > const struct timespec *,timeout,int *,uaddr2,int,val3) > +safe_syscall2(int, rt_sigsuspend, sigset_t *, newset, size_t, sigsetsize) > > static inline int host_to_target_sock_type(int host_type) > { > @@ -7007,7 +7008,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > target_to_host_old_sigset(&set, p); > unlock_user(p, arg1, 0); > #endif > - ret = get_errno(sigsuspend(&set)); > + ret = get_errno(safe_rt_sigsuspend(&set, SIGSET_T_SIZE)); > } > break; > #endif > @@ -7018,7 +7019,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > goto efault; > target_to_host_sigset(&set, p); > unlock_user(p, arg1, 0); > - ret = get_errno(sigsuspend(&set)); > + ret = get_errno(safe_rt_sigsuspend(&set, SIGSET_T_SIZE)); > } > break; > case TARGET_NR_rt_sigtimedwait: >
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index e4b7404..083f26f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -703,6 +703,7 @@ safe_syscall6(int, pselect6, int, nfds, fd_set *, readfds, fd_set *, writefds, \ fd_set *, exceptfds, struct timespec *, timeout, void *, sig) safe_syscall6(int,futex,int *,uaddr,int,op,int,val, \ const struct timespec *,timeout,int *,uaddr2,int,val3) +safe_syscall2(int, rt_sigsuspend, sigset_t *, newset, size_t, sigsetsize) static inline int host_to_target_sock_type(int host_type) { @@ -7007,7 +7008,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, target_to_host_old_sigset(&set, p); unlock_user(p, arg1, 0); #endif - ret = get_errno(sigsuspend(&set)); + ret = get_errno(safe_rt_sigsuspend(&set, SIGSET_T_SIZE)); } break; #endif @@ -7018,7 +7019,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, goto efault; target_to_host_sigset(&set, p); unlock_user(p, arg1, 0); - ret = get_errno(sigsuspend(&set)); + ret = get_errno(safe_rt_sigsuspend(&set, SIGSET_T_SIZE)); } break; case TARGET_NR_rt_sigtimedwait:
Use the safe_syscall wrapper for sigsuspend syscalls. This means that we will definitely deliver a signal that arrives before we do the sigsuspend call, rather than blocking first and delivering afterwards. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> --- linux-user/syscall.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)