summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_process.c
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2005-04-16 22:19:28 +0000
committerkettenis <kettenis@openbsd.org>2005-04-16 22:19:28 +0000
commit2091e84d57585a0ab6648373d5f1bc152a9e42c7 (patch)
tree711047424728968d08fa8766d946440b550c25cb /sys/kern/sys_process.c
parentdo not provide round_buffer if not needed unless explained why in comments (diff)
downloadwireguard-openbsd-2091e84d57585a0ab6648373d5f1bc152a9e42c7.tar.xz
wireguard-openbsd-2091e84d57585a0ab6648373d5f1bc152a9e42c7.zip
Remove regs and fpregs pseudo-files from procfs.
ok deraadt@, miod@
Diffstat (limited to 'sys/kern/sys_process.c')
-rw-r--r--sys/kern/sys_process.c90
1 files changed, 49 insertions, 41 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index 1498a10c954..58ea0e73b3f 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_process.c,v 1.29 2005/04/03 20:21:44 kettenis Exp $ */
+/* $OpenBSD: sys_process.c,v 1.30 2005/04/16 22:19:28 kettenis Exp $ */
/* $NetBSD: sys_process.c,v 1.55 1996/05/15 06:17:47 tls Exp $ */
/*-
@@ -87,6 +87,10 @@ sys_ptrace(p, v, retval)
struct uio uio;
struct iovec iov;
struct ptrace_io_desc piod;
+ struct reg regs;
+#if defined (PT_SETFPREGS) || defined (PT_GETFPREGS)
+ struct fpreg fpregs;
+#endif
#if defined (PT_SETXMMREGS) || defined (PT_GETXMMREGS)
struct xmmregs xmmregs;
#endif
@@ -400,52 +404,58 @@ sys_ptrace(p, v, retval)
goto sendsig;
case PT_SETREGS:
- write = 1;
+ KASSERT((p->p_flag & P_SYSTEM) == 0);
+ if ((error = procfs_checkioperm(p, t)) != 0)
+ return (error);
+
+ error = copyin(SCARG(uap, addr), &regs, sizeof(regs));
+ if (error)
+ return (error);
+ PHOLD(p);
+ error = process_write_regs(t, &regs);
+ PRELE(p);
+ return (error);
case PT_GETREGS:
- /* write = 0 done above. */
- if (!procfs_validregs(t, NULL))
- return (EINVAL);
- else {
- iov.iov_base = SCARG(uap, addr);
- iov.iov_len = sizeof(struct reg);
- uio.uio_iov = &iov;
- uio.uio_iovcnt = 1;
- uio.uio_offset = 0;
- uio.uio_resid = sizeof(struct reg);
- uio.uio_segflg = UIO_USERSPACE;
- uio.uio_rw = write ? UIO_WRITE : UIO_READ;
- uio.uio_procp = p;
- return (procfs_doregs(p, t, NULL, &uio));
- }
+ KASSERT((p->p_flag & P_SYSTEM) == 0);
+ if ((error = procfs_checkioperm(p, t)) != 0)
+ return (error);
+
+ PHOLD(p);
+ error = process_read_regs(t, &regs);
+ PRELE(p);
+ if (error)
+ return (error);
+ return (copyout(&regs, SCARG(uap, addr), sizeof (regs)));
#ifdef PT_SETFPREGS
case PT_SETFPREGS:
- write = 1;
+ KASSERT((p->p_flag & P_SYSTEM) == 0);
+ if ((error = procfs_checkioperm(p, t)) != 0)
+ return (error);
+
+ error = copyin(SCARG(uap, addr), &fpregs, sizeof(fpregs));
+ if (error)
+ return (error);
+ PHOLD(p);
+ error = process_write_fpregs(t, &fpregs);
+ PRELE(p);
+ return (error);
#endif
#ifdef PT_GETFPREGS
case PT_GETFPREGS:
- /* write = 0 done above. */
-#endif
-#if defined(PT_SETFPREGS) || defined(PT_GETFPREGS)
- if (!procfs_validfpregs(t, NULL))
- return (EINVAL);
- else {
- iov.iov_base = SCARG(uap, addr);
- iov.iov_len = sizeof(struct fpreg);
- uio.uio_iov = &iov;
- uio.uio_iovcnt = 1;
- uio.uio_offset = 0;
- uio.uio_resid = sizeof(struct fpreg);
- uio.uio_segflg = UIO_USERSPACE;
- uio.uio_rw = write ? UIO_WRITE : UIO_READ;
- uio.uio_procp = p;
- return (procfs_dofpregs(p, t, NULL, &uio));
- }
+ KASSERT((p->p_flag & P_SYSTEM) == 0);
+ if ((error = procfs_checkioperm(p, t)) != 0)
+ return (error);
+
+ PHOLD(p);
+ error = process_read_fpregs(t, &fpregs);
+ PRELE(p);
+ if (error)
+ return (error);
+ return (copyout(&fpregs, SCARG(uap, addr), sizeof (fpregs)));
#endif
#ifdef PT_SETXMMREGS
case PT_SETXMMREGS:
- if (!procfs_validfpregs(t, NULL))
- return (EINVAL);
-
+ KASSERT((p->p_flag & P_SYSTEM) == 0);
if ((error = procfs_checkioperm(p, t)) != 0)
return (error);
@@ -459,9 +469,7 @@ sys_ptrace(p, v, retval)
#endif
#ifdef PT_GETXMMREGS
case PT_GETXMMREGS:
- if (!procfs_validfpregs(t, NULL))
- return (EINVAL);
-
+ KASSERT((p->p_flag & P_SYSTEM) == 0);
if ((error = procfs_checkioperm(p, t)) != 0)
return (error);