summaryrefslogtreecommitdiff
path: root/sys/miscfs
diff options
context:
space:
mode:
authorPhilip Guenthe <guenther@cvs.openbsd.org>2011-12-24 04:34:21 +0000
committerPhilip Guenthe <guenther@cvs.openbsd.org>2011-12-24 04:34:21 +0000
commit229d872d65676b962f5641f73a3c38de2b1fc14a (patch)
tree1011a403785e5c2d40d0b37c997448a13917b0ed /sys/miscfs
parent9ae881d6aa32672364fa2cb6a7d98ec9563a1c7d (diff)
Remove the ability to ptrace via procfs, as no one is using it, so fixing
and extending it to support rthreads would be a waste of time. Also, don't show rthreads in the process listing in procfs. Reassurances that compat_linux doesn't need this from ajacoutot@ ok kettenis@
Diffstat (limited to 'sys/miscfs')
-rw-r--r--sys/miscfs/procfs/procfs.h13
-rw-r--r--sys/miscfs/procfs/procfs_ctl.c312
-rw-r--r--sys/miscfs/procfs/procfs_note.c65
-rw-r--r--sys/miscfs/procfs/procfs_subr.c11
-rw-r--r--sys/miscfs/procfs/procfs_vnops.c25
5 files changed, 17 insertions, 409 deletions
diff --git a/sys/miscfs/procfs/procfs.h b/sys/miscfs/procfs/procfs.h
index 02b2efab39a..9c091446323 100644
--- a/sys/miscfs/procfs/procfs.h
+++ b/sys/miscfs/procfs/procfs.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: procfs.h,v 1.27 2010/12/21 20:14:43 thib Exp $ */
+/* $OpenBSD: procfs.h,v 1.28 2011/12/24 04:34:20 guenther Exp $ */
/* $NetBSD: procfs.h,v 1.17 1996/02/12 15:01:41 christos Exp $ */
/*
@@ -70,9 +70,6 @@ struct pfsnode {
u_long pfs_fileno; /* unique file id */
};
-#define PROCFS_NOTELEN 64 /* max length of a note (/proc/$pid/note) */
-#define PROCFS_CTLLEN 8 /* max length of a ctl msg (/proc/$pid/ctl */
-
/*
* Kernel stuff follows
*/
@@ -111,24 +108,16 @@ int vfs_getuserstr(struct uio *, char *, int *);
const vfs_namemap_t *vfs_findname(const vfs_namemap_t *, char *, int);
int procfs_allocvp(struct mount *, struct vnode **, pid_t, pfstype);
-int procfs_doctl(struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_dofpregs(struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_donote(struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_doregs(struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
int procfs_dostatus(struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
int procfs_docmdline(struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
int procfs_domeminfo(struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
int procfs_docpuinfo(struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
-int procfs_domap(struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio, int);
int procfs_freevp(struct vnode *);
int procfs_getcpuinfstr(char *, int *);
int procfs_poll(void *);
/* functions to check whether or not files should be displayed */
int procfs_validfile(struct proc *, struct mount *);
-int procfs_validfpregs(struct proc *, struct mount *);
-int procfs_validregs(struct proc *, struct mount *);
-int procfs_validmap(struct proc *, struct mount *);
int procfs_rw(void *);
diff --git a/sys/miscfs/procfs/procfs_ctl.c b/sys/miscfs/procfs/procfs_ctl.c
deleted file mode 100644
index 0fed64e4fc6..00000000000
--- a/sys/miscfs/procfs/procfs_ctl.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/* $OpenBSD: procfs_ctl.c,v 1.22 2010/07/26 01:56:27 guenther Exp $ */
-/* $NetBSD: procfs_ctl.c,v 1.14 1996/02/09 22:40:48 christos Exp $ */
-
-/*
- * Copyright (c) 1993 Jan-Simon Pendry
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)procfs_ctl.c 8.4 (Berkeley) 6/15/94
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/time.h>
-#include <sys/kernel.h>
-#include <sys/proc.h>
-#include <sys/vnode.h>
-#include <sys/ioctl.h>
-#include <sys/tty.h>
-#include <sys/resource.h>
-#include <sys/resourcevar.h>
-#include <sys/signalvar.h>
-#include <sys/ptrace.h>
-#include <sys/sched.h>
-#include <miscfs/procfs/procfs.h>
-
-/*
- * True iff process (p) is in trace wait state
- * relative to process (curp)
- */
-#define TRACE_WAIT_P(curp, p) \
- ((p)->p_stat == SSTOP && \
- (p)->p_p->ps_pptr == (curp)->p_p && \
- ISSET((p)->p_flag, P_TRACED))
-
-#ifdef PTRACE
-
-#define PROCFS_CTL_ATTACH 1
-#define PROCFS_CTL_DETACH 2
-#define PROCFS_CTL_STEP 3
-#define PROCFS_CTL_RUN 4
-#define PROCFS_CTL_WAIT 5
-
-static const vfs_namemap_t ctlnames[] = {
- /* special /proc commands */
- { "attach", PROCFS_CTL_ATTACH },
- { "detach", PROCFS_CTL_DETACH },
- { "step", PROCFS_CTL_STEP },
- { "run", PROCFS_CTL_RUN },
- { "wait", PROCFS_CTL_WAIT },
- { 0 },
-};
-
-#endif
-
-static const vfs_namemap_t signames[] = {
- /* regular signal names */
- { "hup", SIGHUP }, { "int", SIGINT },
- { "quit", SIGQUIT }, { "ill", SIGILL },
- { "trap", SIGTRAP }, { "abrt", SIGABRT },
- { "iot", SIGIOT }, { "emt", SIGEMT },
- { "fpe", SIGFPE }, { "kill", SIGKILL },
- { "bus", SIGBUS }, { "segv", SIGSEGV },
- { "sys", SIGSYS }, { "pipe", SIGPIPE },
- { "alrm", SIGALRM }, { "term", SIGTERM },
- { "urg", SIGURG }, { "stop", SIGSTOP },
- { "tstp", SIGTSTP }, { "cont", SIGCONT },
- { "chld", SIGCHLD }, { "ttin", SIGTTIN },
- { "ttou", SIGTTOU }, { "io", SIGIO },
- { "xcpu", SIGXCPU }, { "xfsz", SIGXFSZ },
- { "vtalrm", SIGVTALRM }, { "prof", SIGPROF },
- { "winch", SIGWINCH }, { "info", SIGINFO },
- { "usr1", SIGUSR1 }, { "usr2", SIGUSR2 },
- { 0 },
-};
-
-#ifdef PTRACE
-static int procfs_control(struct proc *, struct proc *, int);
-
-static int
-procfs_control(struct proc *curp, struct proc *p, int op)
-/* *curp being the tracer, and *p the traced */
-{
- int error;
- int s;
-
- /*
- * Attach - attaches the target process for debugging
- * by the calling process.
- */
- if (op == PROCFS_CTL_ATTACH) {
- /* Can't trace yourself! */
- if (p->p_pid == curp->p_pid)
- return (EINVAL);
-
- /* Check whether already being traced. */
- if (ISSET(p->p_flag, P_TRACED))
- return (EBUSY);
-
- if ((error = process_checkioperm(curp, p)) != 0)
- return (error);
-
- /*
- * Go ahead and set the trace flag.
- * Save the old parent (it's reset in
- * _DETACH, and also in kern_exit.c:wait4()
- * Reparent the process so that the tracing
- * proc gets to see all the action.
- * Stop the target.
- */
- atomic_setbits_int(&p->p_flag, P_TRACED);
- p->p_xstat = 0; /* XXX ? */
- if (p->p_p->ps_pptr != curp->p_p) {
- p->p_oppid = p->p_p->ps_pptr->ps_pid;
- proc_reparent(p->p_p, curp->p_p);
- }
- psignal(p, SIGSTOP);
- return (0);
- }
-
- /*
- * Target process must be stopped, owned by (curp) and
- * be set up for tracing (P_TRACED flag set).
- * Allow DETACH to take place at any time for sanity.
- * Allow WAIT any time, of course.
- */
- switch (op) {
- case PROCFS_CTL_DETACH:
- case PROCFS_CTL_WAIT:
- break;
-
- default:
- if (!TRACE_WAIT_P(curp, p))
- return (EBUSY);
- }
-
- /*
- * do single-step fixup if needed
- */
- FIX_SSTEP(p);
-
- /*
- * Don't deliver any signal by default.
- * To continue with a signal, just send
- * the signal name to the ctl file
- */
- p->p_xstat = 0;
-
- switch (op) {
- /*
- * Detach. Cleans up the target process, reparent it if possible
- * and set it running once more.
- */
- case PROCFS_CTL_DETACH:
- /* if not being traced, then this is a painless no-op */
- if (!ISSET(p->p_flag, P_TRACED))
- return (0);
-
- /* not being traced any more */
- atomic_clearbits_int(&p->p_flag, P_TRACED);
-
- /* give process back to original parent */
- if (p->p_oppid != p->p_p->ps_pptr->ps_pid) {
- struct process *ppr;
-
- ppr = prfind(p->p_oppid);
- if (ppr)
- proc_reparent(p->p_p, ppr);
- }
-
- p->p_oppid = 0;
- atomic_clearbits_int(&p->p_flag, P_WAITED);
- wakeup(curp); /* XXX for CTL_WAIT below ? */
-
- break;
-
- /*
- * Step. Let the target process execute a single instruction.
- */
- case PROCFS_CTL_STEP:
-#ifdef PT_STEP
- error = process_sstep(p, 1);
- if (error)
- return (error);
- break;
-#else
- return (EOPNOTSUPP);
-#endif
-
- /*
- * Run. Let the target process continue running until a breakpoint
- * or some other trap.
- */
- case PROCFS_CTL_RUN:
- break;
-
- /*
- * Wait for the target process to stop.
- * If the target is not being traced then just wait
- * to enter
- */
- case PROCFS_CTL_WAIT:
- error = 0;
- if (ISSET(p->p_flag, P_TRACED)) {
- while (error == 0 &&
- (p->p_stat != SSTOP) &&
- ISSET(p->p_flag, P_TRACED) &&
- (p->p_p->ps_pptr == curp->p_p)) {
- error = tsleep(p, PWAIT|PCATCH, "procfsx", 0);
- }
- if (error == 0 && !TRACE_WAIT_P(curp, p))
- error = EBUSY;
- } else {
- while (error == 0 && p->p_stat != SSTOP) {
- error = tsleep(p, PWAIT|PCATCH, "procfs", 0);
- }
- }
- return (error);
-
-#ifdef DIAGNOSTIC
- default:
- panic("procfs_control");
-#endif
- }
-
- SCHED_LOCK(s);
- if (p->p_stat == SSTOP)
- setrunnable(p);
- SCHED_UNLOCK(s);
- return (0);
-}
-#endif
-
-int
-procfs_doctl(struct proc *curp, struct proc *p, struct pfsnode *pfs, struct uio *uio)
-{
- int xlen;
- int error;
- char msg[PROCFS_CTLLEN+1];
- const vfs_namemap_t *nm;
- int s;
-
- if (uio->uio_rw != UIO_WRITE)
- return (EOPNOTSUPP);
-
- xlen = PROCFS_CTLLEN;
- error = vfs_getuserstr(uio, msg, &xlen);
- if (error)
- return (error);
-
- /*
- * Map signal names into signal generation
- * or debug control. Unknown commands and/or signals
- * return EOPNOTSUPP.
- *
- * Sending a signal while the process is being debugged
- * also has the side effect of letting the target continue
- * to run. There is no way to single-step a signal delivery.
- */
- error = EOPNOTSUPP;
-
-#ifdef PTRACE
- nm = vfs_findname(ctlnames, msg, xlen);
- if (nm) {
- error = procfs_control(curp, p, nm->nm_val);
- } else
-#endif
- {
- nm = vfs_findname(signames, msg, xlen);
- if (nm) {
- if (TRACE_WAIT_P(curp, p)) {
- p->p_xstat = nm->nm_val;
- FIX_SSTEP(p);
- SCHED_LOCK(s);
- setrunnable(p);
- SCHED_UNLOCK(s);
- } else {
- psignal(p, nm->nm_val);
- }
- error = 0;
- }
- }
-
- return (error);
-}
diff --git a/sys/miscfs/procfs/procfs_note.c b/sys/miscfs/procfs/procfs_note.c
deleted file mode 100644
index ce5b68a17e2..00000000000
--- a/sys/miscfs/procfs/procfs_note.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $OpenBSD: procfs_note.c,v 1.4 2007/06/18 08:30:07 jasper Exp $ */
-/* $NetBSD: procfs_note.c,v 1.8 1994/06/29 06:34:53 cgd Exp $ */
-
-/*
- * Copyright (c) 1993 Jan-Simon Pendry
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)procfs_note.c 8.2 (Berkeley) 1/21/94
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/time.h>
-#include <sys/kernel.h>
-#include <sys/proc.h>
-#include <sys/vnode.h>
-#include <sys/signal.h>
-#include <miscfs/procfs/procfs.h>
-
-int
-procfs_donote(struct proc *curp, struct proc *p, struct pfsnode *pfs, struct uio *uio)
-{
- int xlen;
- int error;
- char note[PROCFS_NOTELEN+1];
-
- if (uio->uio_rw != UIO_WRITE)
- return (EINVAL);
-
- xlen = PROCFS_NOTELEN;
- error = vfs_getuserstr(uio, note, &xlen);
- if (error)
- return (error);
-
- /* send to process's notify function */
- return (EOPNOTSUPP);
-}
diff --git a/sys/miscfs/procfs/procfs_subr.c b/sys/miscfs/procfs/procfs_subr.c
index bb504a860aa..d69e534bbb8 100644
--- a/sys/miscfs/procfs/procfs_subr.c
+++ b/sys/miscfs/procfs/procfs_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: procfs_subr.c,v 1.34 2010/12/21 20:14:43 thib Exp $ */
+/* $OpenBSD: procfs_subr.c,v 1.35 2011/12/24 04:34:20 guenther Exp $ */
/* $NetBSD: procfs_subr.c,v 1.15 1996/02/12 15:01:42 christos Exp $ */
/*
@@ -200,7 +200,7 @@ procfs_rw(void *v)
struct proc *p;
p = pfind(pfs->pfs_pid);
- if (p == 0)
+ if (p == 0 || (p->p_flag & P_THREAD))
return (EINVAL);
/* Do not permit games to be played with init(8) */
if (p->p_pid == 1 && securelevel > 0 && uio->uio_rw == UIO_WRITE)
@@ -209,13 +209,6 @@ procfs_rw(void *v)
return (EINVAL);
switch (pfs->pfs_type) {
- case Pnote:
- case Pnotepg:
- return (procfs_donote(curp, p, pfs, uio));
-
- case Pctl:
- return (procfs_doctl(curp, p, pfs, uio));
-
case Pstatus:
return (procfs_dostatus(curp, p, pfs, uio));
diff --git a/sys/miscfs/procfs/procfs_vnops.c b/sys/miscfs/procfs/procfs_vnops.c
index eca4a8fca0d..25ac75ee0bb 100644
--- a/sys/miscfs/procfs/procfs_vnops.c
+++ b/sys/miscfs/procfs/procfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: procfs_vnops.c,v 1.52 2011/04/05 14:14:07 thib Exp $ */
+/* $OpenBSD: procfs_vnops.c,v 1.53 2011/12/24 04:34:20 guenther Exp $ */
/* $NetBSD: procfs_vnops.c,v 1.40 1996/03/16 23:52:55 christos Exp $ */
/*
@@ -86,10 +86,7 @@ struct proc_target {
{ DT_DIR, N(".."), Proot, NULL },
{ DT_REG, N("file"), Pfile, procfs_validfile },
{ DT_REG, N("mem"), Pmem, NULL },
- { DT_REG, N("ctl"), Pctl, NULL },
{ DT_REG, N("status"), Pstatus, NULL },
- { DT_REG, N("note"), Pnote, NULL },
- { DT_REG, N("notepg"), Pnotepg, NULL },
{ DT_REG, N("cmdline"), Pcmdline, NULL },
{ DT_REG, N("exe"), Pfile, procfs_validfile_linux },
#undef N
@@ -192,7 +189,7 @@ procfs_open(void *v)
struct proc *p2; /* traced */
int error;
- if ((p2 = pfind(pfs->pfs_pid)) == 0)
+ if ((p2 = pfind(pfs->pfs_pid)) == 0 || (p2->p_flag & P_THREAD))
return (ENOENT); /* was ESRCH, jsp */
switch (pfs->pfs_type) {
@@ -420,7 +417,7 @@ procfs_getattr(void *v)
default:
procp = pfind(pfs->pfs_pid);
- if (procp == 0)
+ if (procp == 0 || (procp->p_flag & P_THREAD))
return (ENOENT);
}
@@ -700,7 +697,7 @@ procfs_lookup(void *v)
break;
p = pfind(pid);
- if (p == 0)
+ if (p == 0 || (p->p_flag & P_THREAD))
break;
error = procfs_allocvp(dvp->v_mount, vpp, pid, Pproc);
@@ -728,7 +725,7 @@ procfs_lookup(void *v)
}
p = pfind(pfs->pfs_pid);
- if (p == 0)
+ if (p == 0 || (p->p_flag & P_THREAD))
break;
for (pt = proc_targets, i = 0; i < nproc_targets; pt++, i++) {
@@ -833,7 +830,7 @@ procfs_readdir(void *v)
struct proc_target *pt;
p = pfind(pfs->pfs_pid);
- if (p == NULL)
+ if (p == NULL || (p->p_flag & P_THREAD))
break;
for (pt = &proc_targets[i];
@@ -875,6 +872,8 @@ procfs_readdir(void *v)
#ifdef PROCFS_ZOMBIE
again:
#endif
+ while (p && (p->p_flag & P_THREAD))
+ p = LIST_NEXT(p, p_list);
for (; p && uio->uio_resid >= UIO_MX; i++, pcnt++) {
switch (i) {
case 0: /* `.' */
@@ -925,7 +924,9 @@ procfs_readdir(void *v)
default:
while (pcnt < i) {
pcnt++;
- p = LIST_NEXT(p, p_list);
+ do {
+ p = LIST_NEXT(p, p_list);
+ } while (p && (p->p_flag & P_THREAD));
if (!p)
goto done;
}
@@ -933,7 +934,9 @@ procfs_readdir(void *v)
d.d_namlen = snprintf(d.d_name, sizeof(d.d_name),
"%ld", (long)p->p_pid);
d.d_type = DT_REG;
- p = LIST_NEXT(p, p_list);
+ do {
+ p = LIST_NEXT(p, p_list);
+ } while (p && (p->p_flag & P_THREAD));
break;
}