diff options
author | jhb <jhb@FreeBSD.org> | 2000-12-02 01:32:51 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2000-12-02 01:32:51 +0000 |
commit | 6dfe475f408580855e7e48216b477daf39091bc4 (patch) | |
tree | 1c016c0238fdcc6cc620bcd6777b7f5eacc5a0ab /sys/kern/sys_process.c | |
parent | 53f8c633d96f195fc488aa0743b914dbe9ba19de (diff) | |
download | FreeBSD-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.c | 16 |
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; |