summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_process.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2000-12-02 01:32:51 +0000
committerjhb <jhb@FreeBSD.org>2000-12-02 01:32:51 +0000
commit6dfe475f408580855e7e48216b477daf39091bc4 (patch)
tree1c016c0238fdcc6cc620bcd6777b7f5eacc5a0ab /sys/kern/sys_process.c
parent53f8c633d96f195fc488aa0743b914dbe9ba19de (diff)
downloadFreeBSD-src-6dfe475f408580855e7e48216b477daf39091bc4.zip
FreeBSD-src-6dfe475f408580855e7e48216b477daf39091bc4.tar.gz
Protect p_stat with sched_lock.
Diffstat (limited to 'sys/kern/sys_process.c')
-rw-r--r--sys/kern/sys_process.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index 533ba71f..c9abad4 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -280,8 +280,12 @@ ptrace(curp, uap)
return EBUSY;
/* not currently stopped */
- if (p->p_stat != SSTOP || (p->p_flag & P_WAITED) == 0)
+ mtx_enter(&sched_lock, MTX_SPIN);
+ if (p->p_stat != SSTOP || (p->p_flag & P_WAITED) == 0) {
+ mtx_exit(&sched_lock, MTX_SPIN);
return EBUSY;
+ }
+ mtx_exit(&sched_lock, MTX_SPIN);
/* OK */
break;
@@ -363,11 +367,17 @@ ptrace(curp, uap)
sendsig:
/* deliver or queue signal */
s = splhigh();
+ mtx_enter(&sched_lock, MTX_SPIN);
if (p->p_stat == SSTOP) {
p->p_xstat = uap->data;
setrunnable(p);
- } else if (uap->data) {
- psignal(p, uap->data);
+ mtx_exit(&sched_lock, MTX_SPIN);
+ } else {
+ mtx_exit(&sched_lock, MTX_SPIN);
+ if (uap->data) {
+ mtx_assert(&Giant, MA_OWNED);
+ psignal(p, uap->data);
+ }
}
splx(s);
return 0;
OpenPOWER on IntegriCloud