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);

Reply via email to