diff mbox

[28/34] linux-user: Restart sigaction() if signal pending

Message ID 1441497448-32489-29-git-send-email-T.E.Baldwin99@members.leeds.ac.uk
State New
Headers show

Commit Message

Timothy Baldwin Sept. 5, 2015, 11:57 p.m. UTC
Signed-off-by: Timothy Edward Baldwin <T.E.Baldwin99@members.leeds.ac.uk>
---
 linux-user/signal.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

Comments

Peter Maydell Sept. 11, 2015, 2:37 p.m. UTC | #1
On 6 September 2015 at 00:57, Timothy E Baldwin
<T.E.Baldwin99@members.leeds.ac.uk> wrote:
> Signed-off-by: Timothy Edward Baldwin <T.E.Baldwin99@members.leeds.ac.uk>
> ---
>  linux-user/signal.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/linux-user/signal.c b/linux-user/signal.c
> index 15bd082..fc37f3b 100644
> --- a/linux-user/signal.c
> +++ b/linux-user/signal.c
> @@ -629,7 +629,7 @@ out:
>      return ret;
>  }
>
> -/* do_sigaction() return host values and errnos */
> +/* do_sigaction() return target values and host errnos */
>  int do_sigaction(int sig, const struct target_sigaction *act,
>                   struct target_sigaction *oact)
>  {
> @@ -638,8 +638,14 @@ int do_sigaction(int sig, const struct target_sigaction *act,
>      int host_sig;
>      int ret = 0;
>
> -    if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)
> -        return -EINVAL;
> +    if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) {
> +        return -TARGET_EINVAL;
> +    }
> +
> +    if (block_signals()) {
> +        return -TARGET_ERESTARTSYS;
> +    }
> +
>      k = &sigact_table[sig - 1];
>  #if defined(DEBUG_SIGNAL)
>      fprintf(stderr, "sigaction sig=%d act=0x%p, oact=0x%p\n",

This doesn't look right -- we change this function from returning
host errnos to returning guest errnos, but we haven't changed any
of its callers.

thanks
-- PMM
diff mbox

Patch

diff --git a/linux-user/signal.c b/linux-user/signal.c
index 15bd082..fc37f3b 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -629,7 +629,7 @@  out:
     return ret;
 }
 
-/* do_sigaction() return host values and errnos */
+/* do_sigaction() return target values and host errnos */
 int do_sigaction(int sig, const struct target_sigaction *act,
                  struct target_sigaction *oact)
 {
@@ -638,8 +638,14 @@  int do_sigaction(int sig, const struct target_sigaction *act,
     int host_sig;
     int ret = 0;
 
-    if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)
-        return -EINVAL;
+    if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) {
+        return -TARGET_EINVAL;
+    }
+
+    if (block_signals()) {
+        return -TARGET_ERESTARTSYS;
+    }
+
     k = &sigact_table[sig - 1];
 #if defined(DEBUG_SIGNAL)
     fprintf(stderr, "sigaction sig=%d act=0x%p, oact=0x%p\n",