diff options
Diffstat (limited to 'kernel/ptrace.c')
-rw-r--r-- | kernel/ptrace.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 771e93f9c43f..6f357f4fc859 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/hw_breakpoint.h> | 29 | #include <linux/hw_breakpoint.h> |
30 | #include <linux/cn_proc.h> | 30 | #include <linux/cn_proc.h> |
31 | #include <linux/compat.h> | 31 | #include <linux/compat.h> |
32 | #include <linux/sched/signal.h> | ||
32 | 33 | ||
33 | /* | 34 | /* |
34 | * Access another process' address space via ptrace. | 35 | * Access another process' address space via ptrace. |
@@ -924,18 +925,26 @@ int ptrace_request(struct task_struct *child, long request, | |||
924 | ret = ptrace_setsiginfo(child, &siginfo); | 925 | ret = ptrace_setsiginfo(child, &siginfo); |
925 | break; | 926 | break; |
926 | 927 | ||
927 | case PTRACE_GETSIGMASK: | 928 | case PTRACE_GETSIGMASK: { |
929 | sigset_t *mask; | ||
930 | |||
928 | if (addr != sizeof(sigset_t)) { | 931 | if (addr != sizeof(sigset_t)) { |
929 | ret = -EINVAL; | 932 | ret = -EINVAL; |
930 | break; | 933 | break; |
931 | } | 934 | } |
932 | 935 | ||
933 | if (copy_to_user(datavp, &child->blocked, sizeof(sigset_t))) | 936 | if (test_tsk_restore_sigmask(child)) |
937 | mask = &child->saved_sigmask; | ||
938 | else | ||
939 | mask = &child->blocked; | ||
940 | |||
941 | if (copy_to_user(datavp, mask, sizeof(sigset_t))) | ||
934 | ret = -EFAULT; | 942 | ret = -EFAULT; |
935 | else | 943 | else |
936 | ret = 0; | 944 | ret = 0; |
937 | 945 | ||
938 | break; | 946 | break; |
947 | } | ||
939 | 948 | ||
940 | case PTRACE_SETSIGMASK: { | 949 | case PTRACE_SETSIGMASK: { |
941 | sigset_t new_set; | 950 | sigset_t new_set; |
@@ -961,6 +970,8 @@ int ptrace_request(struct task_struct *child, long request, | |||
961 | child->blocked = new_set; | 970 | child->blocked = new_set; |
962 | spin_unlock_irq(&child->sighand->siglock); | 971 | spin_unlock_irq(&child->sighand->siglock); |
963 | 972 | ||
973 | clear_tsk_restore_sigmask(child); | ||
974 | |||
964 | ret = 0; | 975 | ret = 0; |
965 | break; | 976 | break; |
966 | } | 977 | } |