Module Name: src
Committed By: thorpej
Date: Wed Apr 29 01:56:54 UTC 2020
Modified Files:
src/sys/miscfs/procfs: procfs.h procfs_subr.c procfs_vfsops.c
procfs_vnops.c
Log Message:
If the procfs mount is marked as linux-compat, then allow proc lookup
by any LWP ID in the proc, not just the canonical PID.
To generate a diff of this commit:
cvs rdiff -u -r1.78 -r1.79 src/sys/miscfs/procfs/procfs.h
cvs rdiff -u -r1.114 -r1.115 src/sys/miscfs/procfs/procfs_subr.c
cvs rdiff -u -r1.107 -r1.108 src/sys/miscfs/procfs/procfs_vfsops.c
cvs rdiff -u -r1.211 -r1.212 src/sys/miscfs/procfs/procfs_vnops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/miscfs/procfs/procfs.h
diff -u src/sys/miscfs/procfs/procfs.h:1.78 src/sys/miscfs/procfs/procfs.h:1.79
--- src/sys/miscfs/procfs/procfs.h:1.78 Fri Jan 17 20:08:09 2020
+++ src/sys/miscfs/procfs/procfs.h Wed Apr 29 01:56:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs.h,v 1.78 2020/01/17 20:08:09 ad Exp $ */
+/* $NetBSD: procfs.h,v 1.79 2020/04/29 01:56:54 thorpej Exp $ */
/*
* Copyright (c) 1993
@@ -209,7 +209,9 @@ struct vfs_namemap {
int vfs_getuserstr(struct uio *, char *, int *);
const vfs_namemap_t *vfs_findname(const vfs_namemap_t *, const char *, int);
-int procfs_proc_lock(int, struct proc **, int);
+struct proc *procfs_proc_find(struct mount *, pid_t);
+bool procfs_use_linux_compat(struct mount *);
+int procfs_proc_lock(struct mount *, int, struct proc **, int);
void procfs_proc_unlock(struct proc *);
struct mount;
int procfs_allocvp(struct mount *, struct vnode **, pid_t, pfstype, int);
Index: src/sys/miscfs/procfs/procfs_subr.c
diff -u src/sys/miscfs/procfs/procfs_subr.c:1.114 src/sys/miscfs/procfs/procfs_subr.c:1.115
--- src/sys/miscfs/procfs/procfs_subr.c:1.114 Thu Sep 26 17:34:08 2019
+++ src/sys/miscfs/procfs/procfs_subr.c Wed Apr 29 01:56:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs_subr.c,v 1.114 2019/09/26 17:34:08 christos Exp $ */
+/* $NetBSD: procfs_subr.c,v 1.115 2020/04/29 01:56:54 thorpej Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -102,7 +102,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.114 2019/09/26 17:34:08 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.115 2020/04/29 01:56:54 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -152,7 +152,8 @@ procfs_rw(void *v)
if (uio->uio_offset < 0)
return EINVAL;
- if ((error = procfs_proc_lock(pfs->pfs_pid, &p, ESRCH)) != 0)
+ if ((error =
+ procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &p, ESRCH)) != 0)
return error;
curl = curlwp;
@@ -408,8 +409,25 @@ procfs_revoke_vnodes(struct proc *p, voi
vfs_vnode_iterator_destroy(marker);
}
+bool
+procfs_use_linux_compat(struct mount *mp)
+{
+ const int flags = VFSTOPROC(mp)->pmnt_flags;
+
+ return (flags & PROCFSMNT_LINUXCOMPAT) ? true : false;
+}
+
+struct proc *
+procfs_proc_find(struct mount *mp, pid_t pid)
+{
+ KASSERT(mutex_owned(proc_lock));
+ return procfs_use_linux_compat(mp) ? proc_find_lwpid(pid)
+ : proc_find(pid);
+}
+
int
-procfs_proc_lock(int pid, struct proc **bunghole, int notfound)
+procfs_proc_lock(struct mount *mp, int pid, struct proc **bunghole,
+ int notfound)
{
struct proc *tp;
int error = 0;
@@ -418,7 +436,7 @@ procfs_proc_lock(int pid, struct proc **
if (pid == 0)
tp = &proc0;
- else if ((tp = proc_find(pid)) == NULL)
+ else if ((tp = procfs_proc_find(mp, pid)) == NULL)
error = notfound;
if (tp != NULL && !rw_tryenter(&tp->p_reflock, RW_READER))
error = EBUSY;
Index: src/sys/miscfs/procfs/procfs_vfsops.c
diff -u src/sys/miscfs/procfs/procfs_vfsops.c:1.107 src/sys/miscfs/procfs/procfs_vfsops.c:1.108
--- src/sys/miscfs/procfs/procfs_vfsops.c:1.107 Mon Apr 20 05:22:28 2020
+++ src/sys/miscfs/procfs/procfs_vfsops.c Wed Apr 29 01:56:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs_vfsops.c,v 1.107 2020/04/20 05:22:28 htodd Exp $ */
+/* $NetBSD: procfs_vfsops.c,v 1.108 2020/04/29 01:56:54 thorpej Exp $ */
/*
* Copyright (c) 1993
@@ -76,7 +76,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.107 2020/04/20 05:22:28 htodd Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.108 2020/04/29 01:56:54 thorpej Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -322,7 +322,7 @@ procfs_loadvnode(struct mount *mp, struc
struct proc *p;
mutex_enter(proc_lock);
- p = proc_find(pfs->pfs_pid);
+ p = procfs_proc_find(mp, pfs->pfs_pid);
mutex_exit(proc_lock);
if (p == NULL) {
error = ENOENT;
Index: src/sys/miscfs/procfs/procfs_vnops.c
diff -u src/sys/miscfs/procfs/procfs_vnops.c:1.211 src/sys/miscfs/procfs/procfs_vnops.c:1.212
--- src/sys/miscfs/procfs/procfs_vnops.c:1.211 Tue Apr 21 21:42:47 2020
+++ src/sys/miscfs/procfs/procfs_vnops.c Wed Apr 29 01:56:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs_vnops.c,v 1.211 2020/04/21 21:42:47 ad Exp $ */
+/* $NetBSD: procfs_vnops.c,v 1.212 2020/04/29 01:56:54 thorpej Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc.
@@ -105,7 +105,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.211 2020/04/21 21:42:47 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.212 2020/04/29 01:56:54 thorpej Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -318,12 +318,14 @@ procfs_open(void *v)
int a_mode;
kauth_cred_t a_cred;
} */ *ap = v;
- struct pfsnode *pfs = VTOPFS(ap->a_vp);
+ struct vnode *vp = ap->a_vp;
+ struct pfsnode *pfs = VTOPFS(vp);
struct lwp *l1;
struct proc *p2;
int error;
- if ((error = procfs_proc_lock(pfs->pfs_pid, &p2, ENOENT)) != 0)
+ if ((error =
+ procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &p2, ENOENT)) != 0)
return error;
l1 = curlwp; /* tracer */
@@ -428,7 +430,7 @@ procfs_inactive(void *v)
struct pfsnode *pfs = VTOPFS(vp);
mutex_enter(proc_lock);
- *ap->a_recycle = (proc_find(pfs->pfs_pid) == NULL);
+ *ap->a_recycle = (procfs_proc_find(vp->v_mount, pfs->pfs_pid) == NULL);
mutex_exit(proc_lock);
return (0);
@@ -638,7 +640,8 @@ procfs_getattr(void *v)
struct vattr *a_vap;
kauth_cred_t a_cred;
} */ *ap = v;
- struct pfsnode *pfs = VTOPFS(ap->a_vp);
+ struct vnode *vp = ap->a_vp;
+ struct pfsnode *pfs = VTOPFS(vp);
struct vattr *vap = ap->a_vap;
struct proc *procp;
char *path, *bp, bf[16];
@@ -653,7 +656,8 @@ procfs_getattr(void *v)
break;
default:
- error = procfs_proc_lock(pfs->pfs_pid, &procp, ENOENT);
+ error =
+ procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &procp, ENOENT);
if (error != 0)
return (error);
break;
@@ -1074,7 +1078,7 @@ procfs_lookup(void *v)
type = PFSproc;
}
- if (procfs_proc_lock(pid, &p, ESRCH) != 0)
+ if (procfs_proc_lock(dvp->v_mount, pid, &p, ESRCH) != 0)
break;
error = procfs_allocvp(dvp->v_mount, vpp, vnpid, type, -1);
procfs_proc_unlock(p);
@@ -1087,7 +1091,8 @@ procfs_lookup(void *v)
return (error);
}
- if (procfs_proc_lock(pfs->pfs_pid, &p, ESRCH) != 0)
+ if (procfs_proc_lock(dvp->v_mount, pfs->pfs_pid, &p,
+ ESRCH) != 0)
break;
mutex_enter(p->p_lock);
@@ -1139,7 +1144,8 @@ procfs_lookup(void *v)
int fd;
file_t *fp;
- if ((error = procfs_proc_lock(pfs->pfs_pid, &p, ENOENT)) != 0)
+ if ((error = procfs_proc_lock(dvp->v_mount, pfs->pfs_pid, &p,
+ ENOENT)) != 0)
return error;
if (cnp->cn_flags & ISDOTDOT) {
@@ -1175,7 +1181,8 @@ procfs_lookup(void *v)
case PFStask: {
int xpid;
- if ((error = procfs_proc_lock(pfs->pfs_pid, &p, ENOENT)) != 0)
+ if ((error = procfs_proc_lock(dvp->v_mount, pfs->pfs_pid, &p,
+ ENOENT)) != 0)
return error;
if (cnp->cn_flags & ISDOTDOT) {
@@ -1211,10 +1218,7 @@ procfs_validfile(struct lwp *l, struct m
static int
procfs_validfile_linux(struct lwp *l, struct mount *mp)
{
- int flags;
-
- flags = VFSTOPROC(mp)->pmnt_flags;
- return (flags & PROCFSMNT_LINUXCOMPAT) &&
+ return procfs_use_linux_compat(mp) &&
(l == NULL || l->l_proc == NULL || procfs_validfile(l, mp));
}
@@ -1334,7 +1338,7 @@ procfs_readdir(void *v)
if (i >= nproc_targets)
return 0;
- if (procfs_proc_lock(pfs->pfs_pid, &p, ESRCH) != 0)
+ if (procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &p, ESRCH) != 0)
break;
if (ap->a_ncookies) {
@@ -1376,7 +1380,8 @@ procfs_readdir(void *v)
file_t *fp;
int lim, nc = 0;
- if ((error = procfs_proc_lock(pfs->pfs_pid, &p, ESRCH)) != 0)
+ if ((error = procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &p,
+ ESRCH)) != 0)
return error;
/* XXX Should this be by file as well? */
@@ -1444,7 +1449,8 @@ procfs_readdir(void *v)
struct proc *p;
int nc = 0;
- if ((error = procfs_proc_lock(pfs->pfs_pid, &p, ESRCH)) != 0)
+ if ((error = procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &p,
+ ESRCH)) != 0)
return error;
nfd = 3; /* ., .., pid */
@@ -1617,7 +1623,8 @@ procfs_readlink(void *v)
char *path = NULL;
int len = 0;
int error = 0;
- struct pfsnode *pfs = VTOPFS(ap->a_vp);
+ struct vnode *vp = ap->a_vp;
+ struct pfsnode *pfs = VTOPFS(vp);
struct proc *pown = NULL;
if (pfs->pfs_fileno == PROCFS_FILENO(0, PFScurproc, -1))
@@ -1627,13 +1634,15 @@ procfs_readlink(void *v)
else if (pfs->pfs_fileno == PROCFS_FILENO(pfs->pfs_pid, PFStask, 0))
len = snprintf(bf, sizeof(bf), "..");
else if (pfs->pfs_fileno == PROCFS_FILENO(pfs->pfs_pid, PFSexe, -1)) {
- if ((error = procfs_proc_lock(pfs->pfs_pid, &pown, ESRCH)) != 0)
+ if ((error = procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &pown,
+ ESRCH)) != 0)
return error;
bp = pown->p_path;
len = strlen(bp);
} else if (pfs->pfs_fileno == PROCFS_FILENO(pfs->pfs_pid, PFScwd, -1) ||
pfs->pfs_fileno == PROCFS_FILENO(pfs->pfs_pid, PFSchroot, -1)) {
- if ((error = procfs_proc_lock(pfs->pfs_pid, &pown, ESRCH)) != 0)
+ if ((error = procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &pown,
+ ESRCH)) != 0)
return error;
path = malloc(MAXPATHLEN + 4, M_TEMP, M_WAITOK);
if (path == NULL) {
@@ -1647,9 +1656,10 @@ procfs_readlink(void *v)
len = strlen(bp);
} else {
file_t *fp;
- struct vnode *vxp, *vp;
+ struct vnode *vxp;
- if ((error = procfs_proc_lock(pfs->pfs_pid, &pown, ESRCH)) != 0)
+ if ((error = procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &pown,
+ ESRCH)) != 0)
return error;
fp = fd_getfile2(pown, pfs->pfs_fd);