This source file includes following definitions.
- cansignal
- signal_init
- sigactsinit
- sigactsshare
- sigactsunshare
- sigactsfree
- sys_sigaction
- setsigvec
- siginit
- execsigs
- sys_sigprocmask
- sys_sigpending
- sys_sigsuspend
- sys_osigaltstack
- sys_sigaltstack
- sys_kill
- killpg1
- csignal
- gsignal
- pgsignal
- trapsignal
- psignal
- issignal
- proc_stop
- proc_stop_sweep
- postsig
- sigexit
- coredump
- sys_nosys
- sys_thrsigdivert
- initsiginfo
- filt_sigattach
- filt_sigdetach
- filt_signal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 #define SIGPROP
42 #include <sys/param.h>
43 #include <sys/signalvar.h>
44 #include <sys/resourcevar.h>
45 #include <sys/queue.h>
46 #include <sys/namei.h>
47 #include <sys/vnode.h>
48 #include <sys/event.h>
49 #include <sys/proc.h>
50 #include <sys/systm.h>
51 #include <sys/timeb.h>
52 #include <sys/times.h>
53 #include <sys/buf.h>
54 #include <sys/acct.h>
55 #include <sys/file.h>
56 #include <sys/kernel.h>
57 #include <sys/wait.h>
58 #include <sys/ktrace.h>
59 #include <sys/stat.h>
60 #include <sys/core.h>
61 #include <sys/malloc.h>
62 #include <sys/pool.h>
63 #include <sys/ptrace.h>
64 #include <sys/sched.h>
65
66 #include <sys/mount.h>
67 #include <sys/syscallargs.h>
68
69 #include <machine/cpu.h>
70
71 #include <uvm/uvm_extern.h>
72 #include <sys/user.h>
73
74 int filt_sigattach(struct knote *kn);
75 void filt_sigdetach(struct knote *kn);
76 int filt_signal(struct knote *kn, long hint);
77
78 struct filterops sig_filtops =
79 { 0, filt_sigattach, filt_sigdetach, filt_signal };
80
81 void proc_stop(struct proc *p, int);
82 void proc_stop_sweep(void *);
83 struct timeout proc_stop_to;
84
85 int cansignal(struct proc *, struct pcred *, struct proc *, int);
86
87 struct pool sigacts_pool;
88
89
90
91
92 int
93 cansignal(struct proc *p, struct pcred *pc, struct proc *q, int signum)
94 {
95 if (pc->pc_ucred->cr_uid == 0)
96 return (1);
97
98 if (p == q)
99 return (1);
100
101 #ifdef RTHREADS
102
103 if (q->p_flag & P_THREAD) {
104 return (p->p_p == q->p_p);
105 }
106 #endif
107
108 if (signum == SIGCONT && q->p_session == p->p_session)
109 return (1);
110
111
112
113
114
115 if (q->p_flag & P_SUGID) {
116 switch (signum) {
117 case 0:
118 case SIGKILL:
119 case SIGINT:
120 case SIGTERM:
121 case SIGALRM:
122 case SIGSTOP:
123 case SIGTTIN:
124 case SIGTTOU:
125 case SIGTSTP:
126 case SIGHUP:
127 case SIGUSR1:
128 case SIGUSR2:
129 if (pc->p_ruid == q->p_cred->p_ruid ||
130 pc->pc_ucred->cr_uid == q->p_cred->p_ruid ||
131 pc->p_ruid == q->p_ucred->cr_uid ||
132 pc->pc_ucred->cr_uid == q->p_ucred->cr_uid)
133 return (1);
134 }
135 return (0);
136 }
137
138
139
140
141
142 if (pc->p_ruid == q->p_cred->p_ruid ||
143 pc->p_ruid == q->p_cred->p_svuid ||
144 pc->pc_ucred->cr_uid == q->p_cred->p_ruid ||
145 pc->pc_ucred->cr_uid == q->p_cred->p_svuid ||
146 pc->p_ruid == q->p_ucred->cr_uid ||
147 pc->pc_ucred->cr_uid == q->p_ucred->cr_uid)
148 return (1);
149 return (0);
150 }
151
152
153
154
155 void
156 signal_init(void)
157 {
158 timeout_set(&proc_stop_to, proc_stop_sweep, NULL);
159
160 pool_init(&sigacts_pool, sizeof(struct sigacts), 0, 0, 0, "sigapl",
161 &pool_allocator_nointr);
162 }
163
164
165
166
167
168 struct sigacts *
169 sigactsinit(struct proc *p)
170 {
171 struct sigacts *ps;
172
173 ps = pool_get(&sigacts_pool, PR_WAITOK);
174 memcpy(ps, p->p_sigacts, sizeof(struct sigacts));
175 ps->ps_refcnt = 1;
176 return (ps);
177 }
178
179
180
181
182 void
183 sigactsshare(struct proc *p1, struct proc *p2)
184 {
185
186 p2->p_sigacts = p1->p_sigacts;
187 p1->p_sigacts->ps_refcnt++;
188 }
189
190
191
192
193
194 void
195 sigactsunshare(struct proc *p)
196 {
197 struct sigacts *newps;
198
199 if (p->p_sigacts->ps_refcnt == 1)
200 return;
201
202 newps = sigactsinit(p);
203 sigactsfree(p);
204 p->p_sigacts = newps;
205 }
206
207
208
209
210 void
211 sigactsfree(struct proc *p)
212 {
213 struct sigacts *ps = p->p_sigacts;
214
215 if (--ps->ps_refcnt > 0)
216 return;
217
218 p->p_sigacts = NULL;
219
220 pool_put(&sigacts_pool, ps);
221 }
222
223
224 int
225 sys_sigaction(struct proc *p, void *v, register_t *retval)
226 {
227 struct sys_sigaction_args
228
229
230
231 *uap = v;
232 struct sigaction vec;
233 struct sigaction *sa;
234 struct sigacts *ps = p->p_sigacts;
235 int signum;
236 int bit, error;
237
238 signum = SCARG(uap, signum);
239 if (signum <= 0 || signum >= NSIG ||
240 (SCARG(uap, nsa) && (signum == SIGKILL || signum == SIGSTOP)))
241 return (EINVAL);
242 sa = &vec;
243 if (SCARG(uap, osa)) {
244 sa->sa_handler = ps->ps_sigact[signum];
245 sa->sa_mask = ps->ps_catchmask[signum];
246 bit = sigmask(signum);
247 sa->sa_flags = 0;
248 if ((ps->ps_sigonstack & bit) != 0)
249 sa->sa_flags |= SA_ONSTACK;
250 if ((ps->ps_sigintr & bit) == 0)
251 sa->sa_flags |= SA_RESTART;
252 if ((ps->ps_sigreset & bit) != 0)
253 sa->sa_flags |= SA_RESETHAND;
254 if ((ps->ps_siginfo & bit) != 0)
255 sa->sa_flags |= SA_SIGINFO;
256 if (signum == SIGCHLD) {
257 if ((p->p_flag & P_NOCLDSTOP) != 0)
258 sa->sa_flags |= SA_NOCLDSTOP;
259 if ((p->p_flag & P_NOCLDWAIT) != 0)
260 sa->sa_flags |= SA_NOCLDWAIT;
261 }
262 if ((sa->sa_mask & bit) == 0)
263 sa->sa_flags |= SA_NODEFER;
264 sa->sa_mask &= ~bit;
265 error = copyout(sa, SCARG(uap, osa), sizeof (vec));
266 if (error)
267 return (error);
268 }
269 if (SCARG(uap, nsa)) {
270 error = copyin(SCARG(uap, nsa), sa, sizeof (vec));
271 if (error)
272 return (error);
273 setsigvec(p, signum, sa);
274 }
275 return (0);
276 }
277
278 void
279 setsigvec(struct proc *p, int signum, struct sigaction *sa)
280 {
281 struct sigacts *ps = p->p_sigacts;
282 int bit;
283 int s;
284
285 bit = sigmask(signum);
286
287
288
289 s = splhigh();
290 ps->ps_sigact[signum] = sa->sa_handler;
291 if ((sa->sa_flags & SA_NODEFER) == 0)
292 sa->sa_mask |= sigmask(signum);
293 ps->ps_catchmask[signum] = sa->sa_mask &~ sigcantmask;
294 if (signum == SIGCHLD) {
295 if (sa->sa_flags & SA_NOCLDSTOP)
296 atomic_setbits_int(&p->p_flag, P_NOCLDSTOP);
297 else
298 atomic_clearbits_int(&p->p_flag, P_NOCLDSTOP);
299
300
301
302
303
304
305
306 if (p->p_pid != 1 && ((sa->sa_flags & SA_NOCLDWAIT) ||
307 sa->sa_handler == SIG_IGN))
308 atomic_setbits_int(&p->p_flag, P_NOCLDWAIT);
309 else
310 atomic_clearbits_int(&p->p_flag, P_NOCLDWAIT);
311 }
312 if ((sa->sa_flags & SA_RESETHAND) != 0)
313 ps->ps_sigreset |= bit;
314 else
315 ps->ps_sigreset &= ~bit;
316 if ((sa->sa_flags & SA_SIGINFO) != 0)
317 ps->ps_siginfo |= bit;
318 else
319 ps->ps_siginfo &= ~bit;
320 if ((sa->sa_flags & SA_RESTART) == 0)
321 ps->ps_sigintr |= bit;
322 else
323 ps->ps_sigintr &= ~bit;
324 if ((sa->sa_flags & SA_ONSTACK) != 0)
325 ps->ps_sigonstack |= bit;
326 else
327 ps->ps_sigonstack &= ~bit;
328 #ifdef COMPAT_SUNOS
329 {
330 extern struct emul emul_sunos;
331 if (p->p_emul == &emul_sunos) {
332 if (sa->sa_flags & SA_USERTRAMP)
333 ps->ps_usertramp |= bit;
334 else
335 ps->ps_usertramp &= ~bit;
336 }
337 }
338 #endif
339
340
341
342
343
344
345 if (sa->sa_handler == SIG_IGN ||
346 (sigprop[signum] & SA_IGNORE && sa->sa_handler == SIG_DFL)) {
347 atomic_clearbits_int(&p->p_siglist, bit);
348 if (signum != SIGCONT)
349 p->p_sigignore |= bit;
350 p->p_sigcatch &= ~bit;
351 } else {
352 p->p_sigignore &= ~bit;
353 if (sa->sa_handler == SIG_DFL)
354 p->p_sigcatch &= ~bit;
355 else
356 p->p_sigcatch |= bit;
357 }
358 splx(s);
359 }
360
361
362
363
364
365 void
366 siginit(struct proc *p)
367 {
368 int i;
369
370 for (i = 0; i < NSIG; i++)
371 if (sigprop[i] & SA_IGNORE && i != SIGCONT)
372 p->p_sigignore |= sigmask(i);
373 }
374
375
376
377
378 void
379 execsigs(struct proc *p)
380 {
381 struct sigacts *ps;
382 int nc, mask;
383
384 sigactsunshare(p);
385 ps = p->p_sigacts;
386
387
388
389
390
391
392 while (p->p_sigcatch) {
393 nc = ffs((long)p->p_sigcatch);
394 mask = sigmask(nc);
395 p->p_sigcatch &= ~mask;
396 if (sigprop[nc] & SA_IGNORE) {
397 if (nc != SIGCONT)
398 p->p_sigignore |= mask;
399 atomic_clearbits_int(&p->p_siglist, mask);
400 }
401 ps->ps_sigact[nc] = SIG_DFL;
402 }
403
404
405
406
407 ps->ps_sigstk.ss_flags = SS_DISABLE;
408 ps->ps_sigstk.ss_size = 0;
409 ps->ps_sigstk.ss_sp = 0;
410 ps->ps_flags = 0;
411 atomic_clearbits_int(&p->p_flag, P_NOCLDWAIT);
412 if (ps->ps_sigact[SIGCHLD] == SIG_IGN)
413 ps->ps_sigact[SIGCHLD] = SIG_DFL;
414 }
415
416
417
418
419
420
421
422 int
423 sys_sigprocmask(struct proc *p, void *v, register_t *retval)
424 {
425 struct sys_sigprocmask_args
426
427
428 *uap = v;
429 int error = 0;
430 int s;
431
432 *retval = p->p_sigmask;
433 s = splhigh();
434
435 switch (SCARG(uap, how)) {
436 case SIG_BLOCK:
437 p->p_sigmask |= SCARG(uap, mask) &~ sigcantmask;
438 break;
439
440 case SIG_UNBLOCK:
441 p->p_sigmask &= ~SCARG(uap, mask);
442 break;
443
444 case SIG_SETMASK:
445 p->p_sigmask = SCARG(uap, mask) &~ sigcantmask;
446 break;
447
448 default:
449 error = EINVAL;
450 break;
451 }
452 splx(s);
453 return (error);
454 }
455
456
457 int
458 sys_sigpending(struct proc *p, void *v, register_t *retval)
459 {
460
461 *retval = p->p_siglist;
462 return (0);
463 }
464
465
466
467
468
469
470
471 int
472 sys_sigsuspend(struct proc *p, void *v, register_t *retval)
473 {
474 struct sys_sigsuspend_args
475
476 *uap = v;
477 struct sigacts *ps = p->p_sigacts;
478
479
480
481
482
483
484
485
486 ps->ps_oldmask = p->p_sigmask;
487 ps->ps_flags |= SAS_OLDMASK;
488 p->p_sigmask = SCARG(uap, mask) &~ sigcantmask;
489 while (tsleep(ps, PPAUSE|PCATCH, "pause", 0) == 0)
490 ;
491
492 return (EINTR);
493 }
494
495
496 int
497 sys_osigaltstack(struct proc *p, void *v, register_t *retval)
498 {
499 struct sys_osigaltstack_args
500
501
502 *uap = v;
503 struct sigacts *psp;
504 struct osigaltstack ss;
505 int error;
506
507 psp = p->p_sigacts;
508 if ((psp->ps_flags & SAS_ALTSTACK) == 0)
509 psp->ps_sigstk.ss_flags |= SS_DISABLE;
510 if (SCARG(uap, oss)) {
511 ss.ss_sp = psp->ps_sigstk.ss_sp;
512 ss.ss_size = psp->ps_sigstk.ss_size;
513 ss.ss_flags = psp->ps_sigstk.ss_flags;
514 if ((error = copyout(&ss, SCARG(uap, oss), sizeof(ss))))
515 return (error);
516 }
517 if (SCARG(uap, nss) == NULL)
518 return (0);
519 error = copyin(SCARG(uap, nss), &ss, sizeof(ss));
520 if (error)
521 return (error);
522 if (ss.ss_flags & SS_DISABLE) {
523 if (psp->ps_sigstk.ss_flags & SS_ONSTACK)
524 return (EINVAL);
525 psp->ps_flags &= ~SAS_ALTSTACK;
526 psp->ps_sigstk.ss_flags = ss.ss_flags;
527 return (0);
528 }
529 if (ss.ss_size < MINSIGSTKSZ)
530 return (ENOMEM);
531 psp->ps_flags |= SAS_ALTSTACK;
532 psp->ps_sigstk.ss_sp = ss.ss_sp;
533 psp->ps_sigstk.ss_size = ss.ss_size;
534 psp->ps_sigstk.ss_flags = ss.ss_flags;
535 return (0);
536 }
537
538 int
539 sys_sigaltstack(struct proc *p, void *v, register_t *retval)
540 {
541 struct sys_sigaltstack_args
542
543
544 *uap = v;
545 struct sigacts *psp;
546 struct sigaltstack ss;
547 int error;
548
549 psp = p->p_sigacts;
550 if ((psp->ps_flags & SAS_ALTSTACK) == 0)
551 psp->ps_sigstk.ss_flags |= SS_DISABLE;
552 if (SCARG(uap, oss) && (error = copyout(&psp->ps_sigstk,
553 SCARG(uap, oss), sizeof(struct sigaltstack))))
554 return (error);
555 if (SCARG(uap, nss) == NULL)
556 return (0);
557 error = copyin(SCARG(uap, nss), &ss, sizeof(ss));
558 if (error)
559 return (error);
560 if (ss.ss_flags & SS_DISABLE) {
561 if (psp->ps_sigstk.ss_flags & SS_ONSTACK)
562 return (EINVAL);
563 psp->ps_flags &= ~SAS_ALTSTACK;
564 psp->ps_sigstk.ss_flags = ss.ss_flags;
565 return (0);
566 }
567 if (ss.ss_size < MINSIGSTKSZ)
568 return (ENOMEM);
569 psp->ps_flags |= SAS_ALTSTACK;
570 psp->ps_sigstk = ss;
571 return (0);
572 }
573
574
575 int
576 sys_kill(struct proc *cp, void *v, register_t *retval)
577 {
578 struct sys_kill_args
579
580
581 *uap = v;
582 struct proc *p;
583 struct pcred *pc = cp->p_cred;
584
585 if ((u_int)SCARG(uap, signum) >= NSIG)
586 return (EINVAL);
587 if (SCARG(uap, pid) > 0) {
588
589 if ((p = pfind(SCARG(uap, pid))) == NULL)
590 return (ESRCH);
591 if (!cansignal(cp, pc, p, SCARG(uap, signum)))
592 return (EPERM);
593 if (SCARG(uap, signum))
594 psignal(p, SCARG(uap, signum));
595 return (0);
596 }
597 switch (SCARG(uap, pid)) {
598 case -1:
599 return (killpg1(cp, SCARG(uap, signum), 0, 1));
600 case 0:
601 return (killpg1(cp, SCARG(uap, signum), 0, 0));
602 default:
603 return (killpg1(cp, SCARG(uap, signum), -SCARG(uap, pid), 0));
604 }
605
606 }
607
608
609
610
611
612 int
613 killpg1(struct proc *cp, int signum, int pgid, int all)
614 {
615 struct proc *p;
616 struct pcred *pc = cp->p_cred;
617 struct pgrp *pgrp;
618 int nfound = 0;
619
620 if (all)
621
622
623
624 for (p = LIST_FIRST(&allproc); p; p = LIST_NEXT(p, p_list)) {
625 if (p->p_pid <= 1 || p->p_flag & P_SYSTEM ||
626 p == cp || !cansignal(cp, pc, p, signum))
627 continue;
628 nfound++;
629 if (signum)
630 psignal(p, signum);
631 }
632 else {
633 if (pgid == 0)
634
635
636
637 pgrp = cp->p_pgrp;
638 else {
639 pgrp = pgfind(pgid);
640 if (pgrp == NULL)
641 return (ESRCH);
642 }
643 LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
644 if (p->p_pid <= 1 || p->p_flag & P_SYSTEM ||
645 !cansignal(cp, pc, p, signum))
646 continue;
647 nfound++;
648 if (signum && P_ZOMBIE(p) == 0)
649 psignal(p, signum);
650 }
651 }
652 return (nfound ? 0 : ESRCH);
653 }
654
655 #define CANDELIVER(uid, euid, p) \
656 (euid == 0 || \
657 (uid) == (p)->p_cred->p_ruid || \
658 (uid) == (p)->p_cred->p_svuid || \
659 (uid) == (p)->p_ucred->cr_uid || \
660 (euid) == (p)->p_cred->p_ruid || \
661 (euid) == (p)->p_cred->p_svuid || \
662 (euid) == (p)->p_ucred->cr_uid)
663
664
665
666
667
668 void
669 csignal(pid_t pgid, int signum, uid_t uid, uid_t euid)
670 {
671 struct pgrp *pgrp;
672 struct proc *p;
673
674 if (pgid == 0)
675 return;
676 if (pgid < 0) {
677 pgid = -pgid;
678 if ((pgrp = pgfind(pgid)) == NULL)
679 return;
680 LIST_FOREACH(p, &pgrp->pg_members, p_pglist)
681 if (CANDELIVER(uid, euid, p))
682 psignal(p, signum);
683 } else {
684 if ((p = pfind(pgid)) == NULL)
685 return;
686 if (CANDELIVER(uid, euid, p))
687 psignal(p, signum);
688 }
689 }
690
691
692
693
694 void
695 gsignal(int pgid, int signum)
696 {
697 struct pgrp *pgrp;
698
699 if (pgid && (pgrp = pgfind(pgid)))
700 pgsignal(pgrp, signum, 0);
701 }
702
703
704
705
706
707 void
708 pgsignal(struct pgrp *pgrp, int signum, int checkctty)
709 {
710 struct proc *p;
711
712 if (pgrp)
713 LIST_FOREACH(p, &pgrp->pg_members, p_pglist)
714 if ((checkctty == 0 || p->p_flag & P_CONTROLT) &&
715 (p->p_flag & P_THREAD) == 0)
716 psignal(p, signum);
717 }
718
719
720
721
722
723
724 void
725 trapsignal(struct proc *p, int signum, u_long code, int type,
726 union sigval sigval)
727 {
728 struct sigacts *ps = p->p_sigacts;
729 int mask;
730
731 mask = sigmask(signum);
732 if ((p->p_flag & P_TRACED) == 0 && (p->p_sigcatch & mask) != 0 &&
733 (p->p_sigmask & mask) == 0) {
734 #ifdef KTRACE
735 if (KTRPOINT(p, KTR_PSIG)) {
736 siginfo_t si;
737
738 initsiginfo(&si, signum, code, type, sigval);
739 ktrpsig(p, signum, ps->ps_sigact[signum],
740 p->p_sigmask, type, &si);
741 }
742 #endif
743 p->p_stats->p_ru.ru_nsignals++;
744 (*p->p_emul->e_sendsig)(ps->ps_sigact[signum], signum,
745 p->p_sigmask, code, type, sigval);
746 p->p_sigmask |= ps->ps_catchmask[signum];
747 if ((ps->ps_sigreset & mask) != 0) {
748 p->p_sigcatch &= ~mask;
749 if (signum != SIGCONT && sigprop[signum] & SA_IGNORE)
750 p->p_sigignore |= mask;
751 ps->ps_sigact[signum] = SIG_DFL;
752 }
753 } else {
754 ps->ps_sig = signum;
755 ps->ps_code = code;
756 ps->ps_type = type;
757 ps->ps_sigval = sigval;
758 psignal(p, signum);
759 }
760 }
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775 void
776 psignal(struct proc *p, int signum)
777 {
778 int s, prop;
779 sig_t action;
780 int mask;
781 #ifdef RTHREADS
782 struct proc *q;
783 #endif
784 int wakeparent = 0;
785
786 #ifdef DIAGNOSTIC
787 if ((u_int)signum >= NSIG || signum == 0)
788 panic("psignal signal number");
789 #endif
790
791
792 if (p->p_flag & P_WEXIT)
793 return;
794
795 #ifdef RTHREADS
796 TAILQ_FOREACH(q, &p->p_p->ps_threads, p_thr_link) {
797 if (q == p)
798 continue;
799 if (q->p_sigdivert & (1 << signum)) {
800 q->p_sigdivert = 0;
801 psignal(q, signum);
802 return;
803 }
804 }
805 #endif
806
807 KNOTE(&p->p_klist, NOTE_SIGNAL | signum);
808
809 mask = sigmask(signum);
810 prop = sigprop[signum];
811
812
813
814
815 if (p->p_flag & P_TRACED)
816 action = SIG_DFL;
817 else {
818
819
820
821
822
823
824
825 if (p->p_sigignore & mask)
826 return;
827 if (p->p_sigmask & mask)
828 action = SIG_HOLD;
829 else if (p->p_sigcatch & mask)
830 action = SIG_CATCH;
831 else {
832 action = SIG_DFL;
833
834 if (prop & SA_KILL && p->p_nice > NZERO)
835 p->p_nice = NZERO;
836
837
838
839
840
841
842
843 if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0)
844 return;
845 }
846 }
847
848 if (prop & SA_CONT) {
849 #ifdef RTHREADS
850 TAILQ_FOREACH(q, &p->p_p->ps_threads, p_thr_link) {
851 if (q != p)
852 psignal(q, signum);
853 }
854 #endif
855 atomic_clearbits_int(&p->p_siglist, stopsigmask);
856 }
857
858 if (prop & SA_STOP) {
859 #ifdef RTHREADS
860
861 TAILQ_FOREACH(q, &p->p_p->ps_threads, p_thr_link) {
862 if (q != p)
863 psignal(q, signum);
864 }
865 #endif
866 atomic_clearbits_int(&p->p_siglist, contsigmask);
867 atomic_clearbits_int(&p->p_flag, P_CONTINUED);
868 }
869
870 atomic_setbits_int(&p->p_siglist, mask);
871
872
873
874
875
876 if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP))
877 return;
878
879 SCHED_LOCK(s);
880
881 switch (p->p_stat) {
882
883 case SSLEEP:
884
885
886
887
888
889
890 if ((p->p_flag & P_SINTR) == 0)
891 goto out;
892
893
894
895
896
897 if (p->p_flag & P_TRACED)
898 goto run;
899
900
901
902
903
904 if ((prop & SA_CONT) && action == SIG_DFL) {
905 atomic_clearbits_int(&p->p_siglist, mask);
906 goto out;
907 }
908
909
910
911
912 if ((prop & SA_STOP) && action == SIG_DFL) {
913
914
915
916
917 if (p->p_flag & P_PPWAIT)
918 goto out;
919 atomic_clearbits_int(&p->p_siglist, mask);
920 p->p_xstat = signum;
921 proc_stop(p, 0);
922 goto out;
923 }
924
925
926
927
928 goto runfast;
929
930
931 case SSTOP:
932
933
934
935
936 if (p->p_flag & P_TRACED)
937 goto out;
938
939
940
941
942 if (signum == SIGKILL)
943 goto runfast;
944
945 if (prop & SA_CONT) {
946
947
948
949
950
951
952
953
954
955
956 atomic_setbits_int(&p->p_flag, P_CONTINUED);
957 wakeparent = 1;
958 if (action == SIG_DFL)
959 atomic_clearbits_int(&p->p_siglist, mask);
960 if (action == SIG_CATCH)
961 goto runfast;
962 if (p->p_wchan == 0)
963 goto run;
964 p->p_stat = SSLEEP;
965 goto out;
966 }
967
968 if (prop & SA_STOP) {
969
970
971
972
973 atomic_clearbits_int(&p->p_siglist, mask);
974 goto out;
975 }
976
977
978
979
980
981
982
983 if (p->p_wchan && p->p_flag & P_SINTR)
984 unsleep(p);
985 goto out;
986
987 case SONPROC:
988 signotify(p);
989
990 default:
991
992
993
994
995
996 goto out;
997 }
998
999
1000 runfast:
1001
1002
1003
1004 if (p->p_priority > PUSER)
1005 p->p_priority = PUSER;
1006 run:
1007 setrunnable(p);
1008 out:
1009 SCHED_UNLOCK(s);
1010 if (wakeparent)
1011 wakeup(p->p_pptr);
1012 }
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026 int
1027 issignal(struct proc *p)
1028 {
1029 int signum, mask, prop;
1030 int dolock = (p->p_flag & P_SINTR) == 0;
1031 int s;
1032
1033 for (;;) {
1034 mask = p->p_siglist & ~p->p_sigmask;
1035 if (p->p_flag & P_PPWAIT)
1036 mask &= ~stopsigmask;
1037 if (mask == 0)
1038 return (0);
1039 signum = ffs((long)mask);
1040 mask = sigmask(signum);
1041 atomic_clearbits_int(&p->p_siglist, mask);
1042
1043
1044
1045
1046
1047 if (mask & p->p_sigignore && (p->p_flag & P_TRACED) == 0)
1048 continue;
1049
1050 if (p->p_flag & P_TRACED && (p->p_flag & P_PPWAIT) == 0) {
1051
1052
1053
1054
1055 p->p_xstat = signum;
1056
1057 if (dolock)
1058 SCHED_LOCK(s);
1059 proc_stop(p, 1);
1060 if (dolock)
1061 SCHED_UNLOCK(s);
1062
1063
1064
1065
1066
1067 if ((p->p_flag & P_TRACED) == 0 || p->p_xstat == 0)
1068 continue;
1069
1070
1071
1072
1073
1074 signum = p->p_xstat;
1075 mask = sigmask(signum);
1076 if ((p->p_sigmask & mask) != 0)
1077 continue;
1078
1079
1080 atomic_clearbits_int(&p->p_siglist, mask);
1081 }
1082
1083 prop = sigprop[signum];
1084
1085
1086
1087
1088
1089
1090 switch ((long)p->p_sigacts->ps_sigact[signum]) {
1091
1092 case (long)SIG_DFL:
1093
1094
1095
1096 if (p->p_pid <= 1) {
1097 #ifdef DIAGNOSTIC
1098
1099
1100
1101
1102 printf("Process (pid %d) got signal %d\n",
1103 p->p_pid, signum);
1104 #endif
1105 break;
1106 }
1107
1108
1109
1110
1111
1112
1113
1114 if (prop & SA_STOP) {
1115 if (p->p_flag & P_TRACED ||
1116 (p->p_pgrp->pg_jobc == 0 &&
1117 prop & SA_TTYSTOP))
1118 break;
1119 p->p_xstat = signum;
1120 if (dolock)
1121 SCHED_LOCK(s);
1122 proc_stop(p, 1);
1123 if (dolock)
1124 SCHED_UNLOCK(s);
1125 break;
1126 } else if (prop & SA_IGNORE) {
1127
1128
1129
1130
1131 break;
1132 } else
1133 goto keep;
1134
1135
1136 case (long)SIG_IGN:
1137
1138
1139
1140
1141
1142 if ((prop & SA_CONT) == 0 &&
1143 (p->p_flag & P_TRACED) == 0)
1144 printf("issignal\n");
1145 break;
1146
1147 default:
1148
1149
1150
1151
1152 goto keep;
1153 }
1154 }
1155
1156
1157 keep:
1158 atomic_setbits_int(&p->p_siglist, mask);
1159 return (signum);
1160 }
1161
1162
1163
1164
1165
1166
1167 void
1168 proc_stop(struct proc *p, int sw)
1169 {
1170 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
1171 extern void *softclock_si;
1172 #endif
1173 #ifdef MULTIPROCESSOR
1174 SCHED_ASSERT_LOCKED();
1175 #endif
1176
1177 p->p_stat = SSTOP;
1178 atomic_clearbits_int(&p->p_flag, P_WAITED);
1179 atomic_setbits_int(&p->p_flag, P_STOPPED);
1180 if (!timeout_pending(&proc_stop_to)) {
1181 timeout_add(&proc_stop_to, 0);
1182
1183
1184
1185
1186 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
1187 softintr_schedule(softclock_si);
1188 #else
1189 setsoftclock();
1190 #endif
1191 }
1192 if (sw)
1193 mi_switch();
1194 }
1195
1196
1197
1198
1199
1200
1201 void
1202 proc_stop_sweep(void *v)
1203 {
1204 struct proc *p;
1205
1206 LIST_FOREACH(p, &allproc, p_list) {
1207 if ((p->p_flag & P_STOPPED) == 0)
1208 continue;
1209 atomic_clearbits_int(&p->p_flag, P_STOPPED);
1210
1211 if ((p->p_pptr->p_flag & P_NOCLDSTOP) == 0)
1212 psignal(p->p_pptr, SIGCHLD);
1213 wakeup(p->p_pptr);
1214 }
1215 }
1216
1217
1218
1219
1220
1221 void
1222 postsig(int signum)
1223 {
1224 struct proc *p = curproc;
1225 struct sigacts *ps = p->p_sigacts;
1226 sig_t action;
1227 u_long code;
1228 int mask, returnmask;
1229 union sigval sigval;
1230 int s, type;
1231
1232 #ifdef DIAGNOSTIC
1233 if (signum == 0)
1234 panic("postsig");
1235 #endif
1236
1237 KERNEL_PROC_LOCK(p);
1238
1239 mask = sigmask(signum);
1240 atomic_clearbits_int(&p->p_siglist, mask);
1241 action = ps->ps_sigact[signum];
1242 sigval.sival_ptr = 0;
1243 type = SI_USER;
1244
1245 if (ps->ps_sig != signum) {
1246 code = 0;
1247 type = SI_USER;
1248 sigval.sival_ptr = 0;
1249 } else {
1250 code = ps->ps_code;
1251 type = ps->ps_type;
1252 sigval = ps->ps_sigval;
1253 }
1254
1255 #ifdef KTRACE
1256 if (KTRPOINT(p, KTR_PSIG)) {
1257 siginfo_t si;
1258
1259 initsiginfo(&si, signum, code, type, sigval);
1260 ktrpsig(p, signum, action, ps->ps_flags & SAS_OLDMASK ?
1261 ps->ps_oldmask : p->p_sigmask, type, &si);
1262 }
1263 #endif
1264 if (action == SIG_DFL) {
1265
1266
1267
1268
1269 sigexit(p, signum);
1270
1271 } else {
1272
1273
1274
1275 #ifdef DIAGNOSTIC
1276 if (action == SIG_IGN || (p->p_sigmask & mask))
1277 panic("postsig action");
1278 #endif
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288 #ifdef MULTIPROCESSOR
1289 s = splsched();
1290 #else
1291 s = splhigh();
1292 #endif
1293 if (ps->ps_flags & SAS_OLDMASK) {
1294 returnmask = ps->ps_oldmask;
1295 ps->ps_flags &= ~SAS_OLDMASK;
1296 } else
1297 returnmask = p->p_sigmask;
1298 p->p_sigmask |= ps->ps_catchmask[signum];
1299 if ((ps->ps_sigreset & mask) != 0) {
1300 p->p_sigcatch &= ~mask;
1301 if (signum != SIGCONT && sigprop[signum] & SA_IGNORE)
1302 p->p_sigignore |= mask;
1303 ps->ps_sigact[signum] = SIG_DFL;
1304 }
1305 splx(s);
1306 p->p_stats->p_ru.ru_nsignals++;
1307 if (ps->ps_sig == signum) {
1308 ps->ps_sig = 0;
1309 ps->ps_code = 0;
1310 ps->ps_type = SI_USER;
1311 ps->ps_sigval.sival_ptr = NULL;
1312 }
1313
1314 (*p->p_emul->e_sendsig)(action, signum, returnmask, code,
1315 type, sigval);
1316 }
1317
1318 KERNEL_PROC_UNLOCK(p);
1319 }
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329 void
1330 sigexit(struct proc *p, int signum)
1331 {
1332
1333 atomic_setbits_int(&p->p_flag, P_WEXIT);
1334
1335 p->p_acflag |= AXSIG;
1336 if (sigprop[signum] & SA_CORE) {
1337 p->p_sigacts->ps_sig = signum;
1338 if (coredump(p) == 0)
1339 signum |= WCOREFLAG;
1340 }
1341 exit1(p, W_EXITCODE(0, signum), EXIT_NORMAL);
1342
1343 }
1344
1345 int nosuidcoredump = 1;
1346
1347
1348
1349
1350
1351 int
1352 coredump(struct proc *p)
1353 {
1354 struct vnode *vp;
1355 struct ucred *cred = p->p_ucred;
1356 struct vmspace *vm = p->p_vmspace;
1357 struct nameidata nd;
1358 struct vattr vattr;
1359 int error, error1, len;
1360 char name[sizeof("/var/crash/") + MAXCOMLEN + sizeof(".core")];
1361 char *dir = "";
1362 struct core core;
1363
1364
1365
1366
1367
1368
1369 if (((p->p_flag & P_SUGID) && (error = suser(p, 0))) ||
1370 ((p->p_flag & P_SUGID) && nosuidcoredump)) {
1371 if (nosuidcoredump == 2)
1372 dir = "/var/crash/";
1373 else
1374 return (EPERM);
1375 }
1376
1377
1378 if (USPACE + ctob(vm->vm_dsize + vm->vm_ssize) >=
1379 p->p_rlimit[RLIMIT_CORE].rlim_cur)
1380 return (EFBIG);
1381
1382 len = snprintf(name, sizeof(name), "%s%s.core", dir, p->p_comm);
1383 if (len >= sizeof(name))
1384 return (EACCES);
1385
1386
1387
1388
1389 cred = crdup(cred);
1390 cred->cr_uid = p->p_cred->p_ruid;
1391 cred->cr_gid = p->p_cred->p_rgid;
1392
1393 NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, name, p);
1394
1395 error = vn_open(&nd, O_CREAT | FWRITE | O_NOFOLLOW, S_IRUSR | S_IWUSR);
1396
1397 if (error) {
1398 crfree(cred);
1399 return (error);
1400 }
1401
1402
1403
1404
1405
1406 vp = nd.ni_vp;
1407 if ((error = VOP_GETATTR(vp, &vattr, cred, p)) != 0)
1408 goto out;
1409
1410 if (vp->v_type != VREG || vattr.va_nlink != 1 ||
1411 vattr.va_mode & ((VREAD | VWRITE) >> 3 | (VREAD | VWRITE) >> 6)) {
1412 error = EACCES;
1413 goto out;
1414 }
1415 VATTR_NULL(&vattr);
1416 vattr.va_size = 0;
1417 VOP_SETATTR(vp, &vattr, cred, p);
1418 p->p_acflag |= ACORE;
1419 bcopy(p, &p->p_addr->u_kproc.kp_proc, sizeof(struct proc));
1420 fill_eproc(p, &p->p_addr->u_kproc.kp_eproc);
1421
1422 core.c_midmag = 0;
1423 strlcpy(core.c_name, p->p_comm, sizeof(core.c_name));
1424 core.c_nseg = 0;
1425 core.c_signo = p->p_sigacts->ps_sig;
1426 core.c_ucode = p->p_sigacts->ps_code;
1427 core.c_cpusize = 0;
1428 core.c_tsize = (u_long)ctob(vm->vm_tsize);
1429 core.c_dsize = (u_long)ctob(vm->vm_dsize);
1430 core.c_ssize = (u_long)round_page(ctob(vm->vm_ssize));
1431 error = cpu_coredump(p, vp, cred, &core);
1432 if (error)
1433 goto out;
1434
1435
1436
1437
1438 error = uvm_coredump(p, vp, cred, &core);
1439 if (error)
1440 goto out;
1441 error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&core,
1442 (int)core.c_hdrsize, (off_t)0,
1443 UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, NULL, p);
1444 out:
1445 VOP_UNLOCK(vp, 0, p);
1446 error1 = vn_close(vp, FWRITE, cred, p);
1447 crfree(cred);
1448 if (error == 0)
1449 error = error1;
1450 return (error);
1451 }
1452
1453
1454
1455
1456
1457
1458 int
1459 sys_nosys(struct proc *p, void *v, register_t *retval)
1460 {
1461
1462 psignal(p, SIGSYS);
1463 return (ENOSYS);
1464 }
1465
1466 #ifdef RTHREADS
1467 int
1468 sys_thrsigdivert(struct proc *p, void *v, register_t *retval)
1469 {
1470 struct sys_thrsigdivert_args *uap = v;
1471
1472 p->p_sigdivert = SCARG(uap, sigmask);
1473
1474 return (0);
1475 }
1476 #endif
1477
1478 void
1479 initsiginfo(siginfo_t *si, int sig, u_long code, int type, union sigval val)
1480 {
1481 bzero(si, sizeof *si);
1482
1483 si->si_signo = sig;
1484 si->si_code = type;
1485 if (type == SI_USER) {
1486 si->si_value = val;
1487 } else {
1488 switch (sig) {
1489 case SIGSEGV:
1490 case SIGILL:
1491 case SIGBUS:
1492 case SIGFPE:
1493 si->si_addr = val.sival_ptr;
1494 si->si_trapno = code;
1495 break;
1496 case SIGXFSZ:
1497 break;
1498 }
1499 }
1500 }
1501
1502 int
1503 filt_sigattach(struct knote *kn)
1504 {
1505 struct proc *p = curproc;
1506
1507 kn->kn_ptr.p_proc = p;
1508 kn->kn_flags |= EV_CLEAR;
1509
1510
1511 SLIST_INSERT_HEAD(&p->p_klist, kn, kn_selnext);
1512
1513 return (0);
1514 }
1515
1516 void
1517 filt_sigdetach(struct knote *kn)
1518 {
1519 struct proc *p = kn->kn_ptr.p_proc;
1520
1521 SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext);
1522 }
1523
1524
1525
1526
1527
1528
1529
1530 int
1531 filt_signal(struct knote *kn, long hint)
1532 {
1533
1534 if (hint & NOTE_SIGNAL) {
1535 hint &= ~NOTE_SIGNAL;
1536
1537 if (kn->kn_id == hint)
1538 kn->kn_data++;
1539 }
1540 return (kn->kn_data != 0);
1541 }