aboutsummaryrefslogtreecommitdiffstats
path: root/arch/parisc
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2013-02-19 15:11:39 -0500
committerHelge Deller <deller@gmx.de>2013-02-20 16:57:02 -0500
commit2e800dff4f16a6e47adcbea7188fc586bfa5c30b (patch)
tree195fd95575b615ac0f06e35b75110fe5e360730b /arch/parisc
parentbf581e15a443fa3569d9def96b512315ba509d6f (diff)
parisc: fix error return codes for rt_sigaction and rt_sigprocmask
Signed-off-by: Helge Deller <deller@gmx.de>
Diffstat (limited to 'arch/parisc')
-rw-r--r--arch/parisc/kernel/signal32.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c
index 5dede04f2f3e..2ddcabb616ce 100644
--- a/arch/parisc/kernel/signal32.c
+++ b/arch/parisc/kernel/signal32.c
@@ -65,7 +65,7 @@ put_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
65{ 65{
66 compat_sigset_t s; 66 compat_sigset_t s;
67 67
68 if (sz != sizeof *set) 68 if (sz != sizeof(compat_sigset_t))
69 return -EINVAL; 69 return -EINVAL;
70 sigset_64to32(&s, set); 70 sigset_64to32(&s, set);
71 71
@@ -78,7 +78,7 @@ get_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
78 compat_sigset_t s; 78 compat_sigset_t s;
79 int r; 79 int r;
80 80
81 if (sz != sizeof *set) 81 if (sz != sizeof(compat_sigset_t))
82 return -EINVAL; 82 return -EINVAL;
83 83
84 if ((r = copy_from_user(&s, up, sz)) == 0) { 84 if ((r = copy_from_user(&s, up, sz)) == 0) {
@@ -94,8 +94,11 @@ int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, compat_sigset_t _
94 sigset_t old_set, new_set; 94 sigset_t old_set, new_set;
95 int ret; 95 int ret;
96 96
97 if (set && get_sigset32(set, &new_set, sigsetsize)) 97 if (set) {
98 return -EFAULT; 98 ret = get_sigset32(set, &new_set, sigsetsize);
99 if (ret)
100 return ret;
101 }
99 102
100 KERNEL_SYSCALL(ret, sys_rt_sigprocmask, how, set ? (sigset_t __user *)&new_set : NULL, 103 KERNEL_SYSCALL(ret, sys_rt_sigprocmask, how, set ? (sigset_t __user *)&new_set : NULL,
101 oset ? (sigset_t __user *)&old_set : NULL, sigsetsize); 104 oset ? (sigset_t __user *)&old_set : NULL, sigsetsize);
@@ -128,6 +131,10 @@ sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, struct sigacti
128 struct k_sigaction new_sa, old_sa; 131 struct k_sigaction new_sa, old_sa;
129 int ret = -EINVAL; 132 int ret = -EINVAL;
130 133
134 /* XXX: Don't preclude handling different sized sigset_t's. */
135 if (sigsetsize != sizeof(compat_sigset_t))
136 return -EINVAL;
137
131 if (act) { 138 if (act) {
132 if (copy_from_user(&new_sa32.sa, act, sizeof new_sa32.sa)) 139 if (copy_from_user(&new_sa32.sa, act, sizeof new_sa32.sa))
133 return -EFAULT; 140 return -EFAULT;