[S390] noexec protection
[deliverable/linux.git] / arch / s390 / kernel / compat_signal.c
1 /*
2 * arch/s390/kernel/compat_signal.c
3 *
4 * Copyright (C) IBM Corp. 2000,2006
5 * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
6 * Gerhard Tonn (ton@de.ibm.com)
7 *
8 * Copyright (C) 1991, 1992 Linus Torvalds
9 *
10 * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
11 */
12
13 #include <linux/compat.h>
14 #include <linux/sched.h>
15 #include <linux/mm.h>
16 #include <linux/smp.h>
17 #include <linux/smp_lock.h>
18 #include <linux/kernel.h>
19 #include <linux/signal.h>
20 #include <linux/errno.h>
21 #include <linux/wait.h>
22 #include <linux/ptrace.h>
23 #include <linux/unistd.h>
24 #include <linux/stddef.h>
25 #include <linux/tty.h>
26 #include <linux/personality.h>
27 #include <linux/binfmts.h>
28 #include <asm/ucontext.h>
29 #include <asm/uaccess.h>
30 #include <asm/lowcore.h>
31 #include "compat_linux.h"
32 #include "compat_ptrace.h"
33
34 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
35
36 typedef struct
37 {
38 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
39 struct sigcontext32 sc;
40 _sigregs32 sregs;
41 int signo;
42 __u8 retcode[S390_SYSCALL_SIZE];
43 } sigframe32;
44
45 typedef struct
46 {
47 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
48 __u8 retcode[S390_SYSCALL_SIZE];
49 compat_siginfo_t info;
50 struct ucontext32 uc;
51 } rt_sigframe32;
52
53 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
54 {
55 int err;
56
57 if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
58 return -EFAULT;
59
60 /* If you change siginfo_t structure, please be sure
61 this code is fixed accordingly.
62 It should never copy any pad contained in the structure
63 to avoid security leaks, but must copy the generic
64 3 ints plus the relevant union member.
65 This routine must convert siginfo from 64bit to 32bit as well
66 at the same time. */
67 err = __put_user(from->si_signo, &to->si_signo);
68 err |= __put_user(from->si_errno, &to->si_errno);
69 err |= __put_user((short)from->si_code, &to->si_code);
70 if (from->si_code < 0)
71 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
72 else {
73 switch (from->si_code >> 16) {
74 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
75 case __SI_MESGQ >> 16:
76 err |= __put_user(from->si_int, &to->si_int);
77 /* fallthrough */
78 case __SI_KILL >> 16:
79 err |= __put_user(from->si_pid, &to->si_pid);
80 err |= __put_user(from->si_uid, &to->si_uid);
81 break;
82 case __SI_CHLD >> 16:
83 err |= __put_user(from->si_pid, &to->si_pid);
84 err |= __put_user(from->si_uid, &to->si_uid);
85 err |= __put_user(from->si_utime, &to->si_utime);
86 err |= __put_user(from->si_stime, &to->si_stime);
87 err |= __put_user(from->si_status, &to->si_status);
88 break;
89 case __SI_FAULT >> 16:
90 err |= __put_user((unsigned long) from->si_addr,
91 &to->si_addr);
92 break;
93 case __SI_POLL >> 16:
94 err |= __put_user(from->si_band, &to->si_band);
95 err |= __put_user(from->si_fd, &to->si_fd);
96 break;
97 case __SI_TIMER >> 16:
98 err |= __put_user(from->si_tid, &to->si_tid);
99 err |= __put_user(from->si_overrun, &to->si_overrun);
100 err |= __put_user(from->si_int, &to->si_int);
101 break;
102 default:
103 break;
104 }
105 }
106 return err;
107 }
108
109 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
110 {
111 int err;
112 u32 tmp;
113
114 if (!access_ok (VERIFY_READ, from, sizeof(compat_siginfo_t)))
115 return -EFAULT;
116
117 err = __get_user(to->si_signo, &from->si_signo);
118 err |= __get_user(to->si_errno, &from->si_errno);
119 err |= __get_user(to->si_code, &from->si_code);
120
121 if (to->si_code < 0)
122 err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
123 else {
124 switch (to->si_code >> 16) {
125 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
126 case __SI_MESGQ >> 16:
127 err |= __get_user(to->si_int, &from->si_int);
128 /* fallthrough */
129 case __SI_KILL >> 16:
130 err |= __get_user(to->si_pid, &from->si_pid);
131 err |= __get_user(to->si_uid, &from->si_uid);
132 break;
133 case __SI_CHLD >> 16:
134 err |= __get_user(to->si_pid, &from->si_pid);
135 err |= __get_user(to->si_uid, &from->si_uid);
136 err |= __get_user(to->si_utime, &from->si_utime);
137 err |= __get_user(to->si_stime, &from->si_stime);
138 err |= __get_user(to->si_status, &from->si_status);
139 break;
140 case __SI_FAULT >> 16:
141 err |= __get_user(tmp, &from->si_addr);
142 to->si_addr = (void __user *)(u64) (tmp & PSW32_ADDR_INSN);
143 break;
144 case __SI_POLL >> 16:
145 err |= __get_user(to->si_band, &from->si_band);
146 err |= __get_user(to->si_fd, &from->si_fd);
147 break;
148 case __SI_TIMER >> 16:
149 err |= __get_user(to->si_tid, &from->si_tid);
150 err |= __get_user(to->si_overrun, &from->si_overrun);
151 err |= __get_user(to->si_int, &from->si_int);
152 break;
153 default:
154 break;
155 }
156 }
157 return err;
158 }
159
160 asmlinkage long
161 sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
162 struct old_sigaction32 __user *oact)
163 {
164 struct k_sigaction new_ka, old_ka;
165 unsigned long sa_handler, sa_restorer;
166 int ret;
167
168 if (act) {
169 compat_old_sigset_t mask;
170 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
171 __get_user(sa_handler, &act->sa_handler) ||
172 __get_user(sa_restorer, &act->sa_restorer) ||
173 __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
174 __get_user(mask, &act->sa_mask))
175 return -EFAULT;
176 new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
177 new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer;
178 siginitset(&new_ka.sa.sa_mask, mask);
179 }
180
181 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
182
183 if (!ret && oact) {
184 sa_handler = (unsigned long) old_ka.sa.sa_handler;
185 sa_restorer = (unsigned long) old_ka.sa.sa_restorer;
186 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
187 __put_user(sa_handler, &oact->sa_handler) ||
188 __put_user(sa_restorer, &oact->sa_restorer) ||
189 __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
190 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
191 return -EFAULT;
192 }
193
194 return ret;
195 }
196
197 asmlinkage long
198 sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
199 struct sigaction32 __user *oact, size_t sigsetsize)
200 {
201 struct k_sigaction new_ka, old_ka;
202 unsigned long sa_handler;
203 int ret;
204 compat_sigset_t set32;
205
206 /* XXX: Don't preclude handling different sized sigset_t's. */
207 if (sigsetsize != sizeof(compat_sigset_t))
208 return -EINVAL;
209
210 if (act) {
211 ret = get_user(sa_handler, &act->sa_handler);
212 ret |= __copy_from_user(&set32, &act->sa_mask,
213 sizeof(compat_sigset_t));
214 switch (_NSIG_WORDS) {
215 case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
216 | (((long)set32.sig[7]) << 32);
217 case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
218 | (((long)set32.sig[5]) << 32);
219 case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
220 | (((long)set32.sig[3]) << 32);
221 case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
222 | (((long)set32.sig[1]) << 32);
223 }
224 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
225
226 if (ret)
227 return -EFAULT;
228 new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
229 }
230
231 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
232
233 if (!ret && oact) {
234 switch (_NSIG_WORDS) {
235 case 4:
236 set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
237 set32.sig[6] = old_ka.sa.sa_mask.sig[3];
238 case 3:
239 set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
240 set32.sig[4] = old_ka.sa.sa_mask.sig[2];
241 case 2:
242 set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
243 set32.sig[2] = old_ka.sa.sa_mask.sig[1];
244 case 1:
245 set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
246 set32.sig[0] = old_ka.sa.sa_mask.sig[0];
247 }
248 ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
249 ret |= __copy_to_user(&oact->sa_mask, &set32,
250 sizeof(compat_sigset_t));
251 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
252 }
253
254 return ret;
255 }
256
257 asmlinkage long
258 sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss,
259 struct pt_regs *regs)
260 {
261 stack_t kss, koss;
262 unsigned long ss_sp;
263 int ret, err = 0;
264 mm_segment_t old_fs = get_fs();
265
266 if (uss) {
267 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
268 return -EFAULT;
269 err |= __get_user(ss_sp, &uss->ss_sp);
270 err |= __get_user(kss.ss_size, &uss->ss_size);
271 err |= __get_user(kss.ss_flags, &uss->ss_flags);
272 if (err)
273 return -EFAULT;
274 kss.ss_sp = (void __user *) ss_sp;
275 }
276
277 set_fs (KERNEL_DS);
278 ret = do_sigaltstack((stack_t __force __user *) (uss ? &kss : NULL),
279 (stack_t __force __user *) (uoss ? &koss : NULL),
280 regs->gprs[15]);
281 set_fs (old_fs);
282
283 if (!ret && uoss) {
284 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
285 return -EFAULT;
286 ss_sp = (unsigned long) koss.ss_sp;
287 err |= __put_user(ss_sp, &uoss->ss_sp);
288 err |= __put_user(koss.ss_size, &uoss->ss_size);
289 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
290 if (err)
291 return -EFAULT;
292 }
293 return ret;
294 }
295
296 static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
297 {
298 _s390_regs_common32 regs32;
299 int err, i;
300
301 regs32.psw.mask = PSW32_MASK_MERGE(psw32_user_bits,
302 (__u32)(regs->psw.mask >> 32));
303 regs32.psw.addr = PSW32_ADDR_AMODE31 | (__u32) regs->psw.addr;
304 for (i = 0; i < NUM_GPRS; i++)
305 regs32.gprs[i] = (__u32) regs->gprs[i];
306 save_access_regs(current->thread.acrs);
307 memcpy(regs32.acrs, current->thread.acrs, sizeof(regs32.acrs));
308 err = __copy_to_user(&sregs->regs, &regs32, sizeof(regs32));
309 if (err)
310 return err;
311 save_fp_regs(&current->thread.fp_regs);
312 /* s390_fp_regs and _s390_fp_regs32 are the same ! */
313 return __copy_to_user(&sregs->fpregs, &current->thread.fp_regs,
314 sizeof(_s390_fp_regs32));
315 }
316
317 static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
318 {
319 _s390_regs_common32 regs32;
320 int err, i;
321
322 /* Alwys make any pending restarted system call return -EINTR */
323 current_thread_info()->restart_block.fn = do_no_restart_syscall;
324
325 err = __copy_from_user(&regs32, &sregs->regs, sizeof(regs32));
326 if (err)
327 return err;
328 regs->psw.mask = PSW_MASK_MERGE(regs->psw.mask,
329 (__u64)regs32.psw.mask << 32);
330 regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN);
331 for (i = 0; i < NUM_GPRS; i++)
332 regs->gprs[i] = (__u64) regs32.gprs[i];
333 memcpy(current->thread.acrs, regs32.acrs, sizeof(current->thread.acrs));
334 restore_access_regs(current->thread.acrs);
335
336 err = __copy_from_user(&current->thread.fp_regs, &sregs->fpregs,
337 sizeof(_s390_fp_regs32));
338 current->thread.fp_regs.fpc &= FPC_VALID_MASK;
339 if (err)
340 return err;
341
342 restore_fp_regs(&current->thread.fp_regs);
343 regs->trap = -1; /* disable syscall checks */
344 return 0;
345 }
346
347 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
348 {
349 sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15];
350 sigset_t set;
351
352 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
353 goto badframe;
354 if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
355 goto badframe;
356
357 sigdelsetmask(&set, ~_BLOCKABLE);
358 spin_lock_irq(&current->sighand->siglock);
359 current->blocked = set;
360 recalc_sigpending();
361 spin_unlock_irq(&current->sighand->siglock);
362
363 if (restore_sigregs32(regs, &frame->sregs))
364 goto badframe;
365
366 return regs->gprs[2];
367
368 badframe:
369 force_sig(SIGSEGV, current);
370 return 0;
371 }
372
373 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
374 {
375 rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
376 sigset_t set;
377 stack_t st;
378 __u32 ss_sp;
379 int err;
380 mm_segment_t old_fs = get_fs();
381
382 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
383 goto badframe;
384 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
385 goto badframe;
386
387 sigdelsetmask(&set, ~_BLOCKABLE);
388 spin_lock_irq(&current->sighand->siglock);
389 current->blocked = set;
390 recalc_sigpending();
391 spin_unlock_irq(&current->sighand->siglock);
392
393 if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
394 goto badframe;
395
396 err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp);
397 st.ss_sp = compat_ptr(ss_sp);
398 err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
399 err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
400 if (err)
401 goto badframe;
402
403 set_fs (KERNEL_DS);
404 do_sigaltstack((stack_t __force __user *)&st, NULL, regs->gprs[15]);
405 set_fs (old_fs);
406
407 return regs->gprs[2];
408
409 badframe:
410 force_sig(SIGSEGV, current);
411 return 0;
412 }
413
414 /*
415 * Set up a signal frame.
416 */
417
418
419 /*
420 * Determine which stack to use..
421 */
422 static inline void __user *
423 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
424 {
425 unsigned long sp;
426
427 /* Default to using normal stack */
428 sp = (unsigned long) A(regs->gprs[15]);
429
430 /* This is the X/Open sanctioned signal stack switching. */
431 if (ka->sa.sa_flags & SA_ONSTACK) {
432 if (! sas_ss_flags(sp))
433 sp = current->sas_ss_sp + current->sas_ss_size;
434 }
435
436 /* This is the legacy signal stack switching. */
437 else if (!user_mode(regs) &&
438 !(ka->sa.sa_flags & SA_RESTORER) &&
439 ka->sa.sa_restorer) {
440 sp = (unsigned long) ka->sa.sa_restorer;
441 }
442
443 return (void __user *)((sp - frame_size) & -8ul);
444 }
445
446 static inline int map_signal(int sig)
447 {
448 if (current_thread_info()->exec_domain
449 && current_thread_info()->exec_domain->signal_invmap
450 && sig < 32)
451 return current_thread_info()->exec_domain->signal_invmap[sig];
452 else
453 return sig;
454 }
455
456 static int setup_frame32(int sig, struct k_sigaction *ka,
457 sigset_t *set, struct pt_regs * regs)
458 {
459 sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(sigframe32));
460 if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe32)))
461 goto give_sigsegv;
462
463 if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
464 goto give_sigsegv;
465
466 if (save_sigregs32(regs, &frame->sregs))
467 goto give_sigsegv;
468 if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs))
469 goto give_sigsegv;
470
471 /* Set up to return from userspace. If provided, use a stub
472 already in userspace. */
473 if (ka->sa.sa_flags & SA_RESTORER) {
474 regs->gprs[14] = (__u64) ka->sa.sa_restorer;
475 } else {
476 regs->gprs[14] = (__u64) frame->retcode;
477 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
478 (u16 __user *)(frame->retcode)))
479 goto give_sigsegv;
480 }
481
482 /* Set up backchain. */
483 if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
484 goto give_sigsegv;
485
486 /* Set up registers for signal handler */
487 regs->gprs[15] = (__u64) frame;
488 regs->psw.addr = (__u64) ka->sa.sa_handler;
489
490 regs->gprs[2] = map_signal(sig);
491 regs->gprs[3] = (__u64) &frame->sc;
492
493 /* We forgot to include these in the sigcontext.
494 To avoid breaking binary compatibility, they are passed as args. */
495 regs->gprs[4] = current->thread.trap_no;
496 regs->gprs[5] = current->thread.prot_addr;
497
498 /* Place signal number on stack to allow backtrace from handler. */
499 if (__put_user(regs->gprs[2], (int __user *) &frame->signo))
500 goto give_sigsegv;
501 return 0;
502
503 give_sigsegv:
504 force_sigsegv(sig, current);
505 return -EFAULT;
506 }
507
508 static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
509 sigset_t *set, struct pt_regs * regs)
510 {
511 int err = 0;
512 rt_sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
513 if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
514 goto give_sigsegv;
515
516 if (copy_siginfo_to_user32(&frame->info, info))
517 goto give_sigsegv;
518
519 /* Create the ucontext. */
520 err |= __put_user(0, &frame->uc.uc_flags);
521 err |= __put_user(0, &frame->uc.uc_link);
522 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
523 err |= __put_user(sas_ss_flags(regs->gprs[15]),
524 &frame->uc.uc_stack.ss_flags);
525 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
526 err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
527 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
528 if (err)
529 goto give_sigsegv;
530
531 /* Set up to return from userspace. If provided, use a stub
532 already in userspace. */
533 if (ka->sa.sa_flags & SA_RESTORER) {
534 regs->gprs[14] = (__u64) ka->sa.sa_restorer;
535 } else {
536 regs->gprs[14] = (__u64) frame->retcode;
537 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
538 (u16 __user *)(frame->retcode));
539 }
540
541 /* Set up backchain. */
542 if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
543 goto give_sigsegv;
544
545 /* Set up registers for signal handler */
546 regs->gprs[15] = (__u64) frame;
547 regs->psw.addr = (__u64) ka->sa.sa_handler;
548
549 regs->gprs[2] = map_signal(sig);
550 regs->gprs[3] = (__u64) &frame->info;
551 regs->gprs[4] = (__u64) &frame->uc;
552 return 0;
553
554 give_sigsegv:
555 force_sigsegv(sig, current);
556 return -EFAULT;
557 }
558
559 /*
560 * OK, we're invoking a handler
561 */
562
563 int
564 handle_signal32(unsigned long sig, struct k_sigaction *ka,
565 siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
566 {
567 int ret;
568
569 /* Set up the stack frame */
570 if (ka->sa.sa_flags & SA_SIGINFO)
571 ret = setup_rt_frame32(sig, ka, info, oldset, regs);
572 else
573 ret = setup_frame32(sig, ka, oldset, regs);
574
575 if (ret == 0) {
576 spin_lock_irq(&current->sighand->siglock);
577 sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
578 if (!(ka->sa.sa_flags & SA_NODEFER))
579 sigaddset(&current->blocked,sig);
580 recalc_sigpending();
581 spin_unlock_irq(&current->sighand->siglock);
582 }
583 return ret;
584 }
585
This page took 0.074955 seconds and 5 git commands to generate.