summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/alpha/alpha/machdep.c9
-rw-r--r--sys/kern/sys_process.c16
2 files changed, 11 insertions, 14 deletions
diff --git a/sys/alpha/alpha/machdep.c b/sys/alpha/alpha/machdep.c
index cff99c3..b374cbf 100644
--- a/sys/alpha/alpha/machdep.c
+++ b/sys/alpha/alpha/machdep.c
@@ -1914,10 +1914,9 @@ ptrace_single_step(struct thread *td)
if (td->td_md.md_flags & (MDTD_STEP1|MDTD_STEP2))
panic("ptrace_single_step: step breakpoints not removed");
- PROC_UNLOCK(td->td_proc);
error = ptrace_read_int(td, pc, &ins.bits);
if (error)
- goto err;
+ return (error);
switch (ins.branch_format.opcode) {
@@ -1957,20 +1956,18 @@ ptrace_single_step(struct thread *td)
td->td_md.md_sstep[0].addr = addr[0];
error = ptrace_set_bpt(td, &td->td_md.md_sstep[0]);
if (error)
- goto err;
+ return (error);
if (count == 2) {
td->td_md.md_sstep[1].addr = addr[1];
error = ptrace_set_bpt(td, &td->td_md.md_sstep[1]);
if (error) {
ptrace_clear_bpt(td, &td->td_md.md_sstep[0]);
- goto err;
+ return (error);
}
td->td_md.md_flags |= MDTD_STEP2;
} else
td->td_md.md_flags |= MDTD_STEP1;
-err:
- PROC_LOCK(td->td_proc);
return (error);
}
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index dcfad3d..a43e7b0 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -154,18 +154,21 @@ proc_rwmem(struct proc *p, struct uio *uio)
vm_prot_t reqprot;
int error, writing;
- GIANT_REQUIRED;
-
+ mtx_lock(&Giant);
/*
* if the vmspace is in the midst of being deallocated or the
* process is exiting, don't try to grab anything. The page table
* usage in that process can be messed up.
*/
vm = p->p_vmspace;
- if ((p->p_flag & P_WEXIT))
+ if ((p->p_flag & P_WEXIT)) {
+ mtx_unlock(&Giant);
return (EFAULT);
- if (vm->vm_refcnt < 1)
+ }
+ if (vm->vm_refcnt < 1) {
+ mtx_unlock(&Giant);
return (EFAULT);
+ }
++vm->vm_refcnt;
/*
* The map we want...
@@ -274,6 +277,7 @@ proc_rwmem(struct proc *p, struct uio *uio)
} while (error == 0 && uio->uio_resid > 0);
vmspace_free(vm);
+ mtx_unlock(&Giant);
return (error);
}
@@ -602,9 +606,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
uio.uio_segflg = UIO_SYSSPACE; /* i.e.: the uap */
uio.uio_rw = write ? UIO_WRITE : UIO_READ;
uio.uio_td = td;
- mtx_lock(&Giant);
error = proc_rwmem(p, &uio);
- mtx_unlock(&Giant);
if (uio.uio_resid != 0) {
/*
* XXX proc_rwmem() doesn't currently return ENOSPC,
@@ -645,9 +647,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
default:
return (EINVAL);
}
- mtx_lock(&Giant);
error = proc_rwmem(p, &uio);
- mtx_unlock(&Giant);
piod->piod_len -= uio.uio_resid;
return (error);
OpenPOWER on IntegriCloud