diff mbox

[v2,06/19] linux-user: Use safe_syscall for sigsuspend syscalls

Message ID 1464360721-14359-7-git-send-email-peter.maydell@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Maydell May 27, 2016, 2:51 p.m. UTC
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(-)

Comments

Laurent Vivier June 7, 2016, 7:20 a.m. UTC | #1
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 mbox

Patch

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: