Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Aug 2000 20:20:06 +0900
From:      "Akinori -Aki- MUSHA" <knu@idaemons.org>
To:        Robert Watson <rwatson@FreeBSD.org>
Cc:        des@FreeBSD.org, cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sys/sys vnode.h src/sys/kern vfs_subr.c         src/sys/fs/devfs devfs_vnops.c src/sys/fs/hpfs hpfs_vnops.c         src/sys/isofs/cd9660 cd9660_vnops.c src/sys/miscfs/kernfs         kernfs_vnops.c src/sys/msdosfs msdosfs_vnops.c src/sys/ntfs ...
Message-ID:  <86hf83572x.wl@archon.local.idaemons.org>
In-Reply-To: In your message of "Tue, 29 Aug 2000 07:45:50 -0700 (PDT)" <200008291445.HAA33366@freefall.freebsd.org>
References:  <200008291445.HAA33366@freefall.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
At Tue, 29 Aug 2000 07:45:50 -0700 (PDT),
Robert Watson wrote:
> rwatson     2000/08/29 07:45:50 PDT
> 
>   Modified files:
>     sys/sys              vnode.h 
>     sys/kern             vfs_subr.c 
>     sys/fs/devfs         devfs_vnops.c 
>     sys/fs/hpfs          hpfs_vnops.c 
>     sys/isofs/cd9660     cd9660_vnops.c 
>     sys/miscfs/kernfs    kernfs_vnops.c 
>     sys/msdosfs          msdosfs_vnops.c 
>     sys/ntfs             ntfs_vnops.c 
>     sys/ufs/ufs          ufs_vnops.c 
>   Log:
>   o Restructure vaccess() so as to check for DAC permission to modify the
>     object before falling back on privilege.  Make vaccess() accept an
>     additional optional argument, privused, to determine whether
>     privilege was required for vaccess() to return 0.  Add commented
>     out capability checks for reference.  Rename some variables to make
>     it more clear which modes/uids/etc are associated with the object,
>     and which with the access mode.
>   o Update file system use of vaccess() to pass NULL as the optional
>     privused argument.  Once additional patches are applied, suser()
>     will no longer set ASU, so privused will permit passing of
>     privilege information up the stack to the caller.
>   
>   Reviewed by:	bde, green, phk, -security, others
>   Obtained from:	TrustedBSD Project

Somehow sys/i386/linux/linprocfs/linprocfs_vnops.c seems forgotten.
I've cooked up a patch as attached, but I'm not sure if it's
correct. (It's working as far as I test, though)

Please unbreak linprocfs soon, thanks.

-- 
                           /
                          /__  __       
                         / )  )  ) )  /
Akinori -Aki- MUSHA aka / (_ /  ( (__(  @ idaemons.org / FreeBSD.org

"We're only at home when we're on the run, on the wing, on the fly"

Index: linprocfs_vnops.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/linux/linprocfs/linprocfs_vnops.c,v
retrieving revision 1.3
diff -u -r1.3 linprocfs_vnops.c
--- linprocfs_vnops.c	2000/05/24 07:37:02	1.3
+++ linprocfs_vnops.c	2000/08/30 11:05:48
@@ -129,7 +129,7 @@
 	p2 = PFIND(pfs->pfs_pid);
 	if (p2 == NULL)
 		return (ENOENT);
-	if (pfs->pfs_pid && !PRISON_CHECK(ap->a_p, p2))
+	if (pfs->pfs_pid && p_can(ap->a_p, p2, P_CAN_SEE, NULL))
 		return (ENOENT);
 
 	switch (pfs->pfs_type) {
@@ -139,7 +139,7 @@
 			return (EBUSY);
 
 		p1 = ap->a_p;
-		if (p_trespass(p1, p2) &&
+		if (p_can(p1, p2, P_CAN_DEBUG, NULL) &&
 		    !procfs_kmemaccess(p1))
 			return (EPERM);
 
@@ -231,8 +231,11 @@
 		return ENOTTY;
 	}
 
-	if (p_trespass(p, procp))
-		return EPERM;
+	if ((error = p_can(p, procp, P_CAN_DEBUG, NULL))) {
+		if (error == ESRCH)
+			error = ENOENT;
+		return (error);
+	}
 
 	switch (ap->a_command) {
 	case PIOCBIS:
@@ -431,6 +434,9 @@
 		if (procp == 0 || procp->p_cred == NULL ||
 		    procp->p_ucred == NULL)
 			return (ENOENT);
+
+		if (p_can(ap->a_p, procp, P_CAN_SEE, NULL))
+			return (ENOENT);
 	}
 
 	error = 0;
@@ -599,16 +605,22 @@
 		struct proc *a_p;
 	} */ *ap;
 {
+	struct pfsnode *pfs = VTOPFS(ap->a_vp);
+	struct proc *procp;
 	struct vattr *vap;
 	struct vattr vattr;
 	int error;
 
-	/*
-	 * If you're the super-user,
-	 * you always get access.
-	 */
-	if (ap->a_cred->cr_uid == 0)
-		return (0);
+	switch (pfs->pfs_type) {
+	case Proot:
+		break;
+	default:
+		procp = PFIND(pfs->pfs_pid);
+		if (procp == NULL)
+			return (ENOENT);
+		if (p_can(ap->a_p, procp, P_CAN_SEE, NULL))
+		return (ENOENT);
+	}
 
 	vap = &vattr;
 	error = VOP_GETATTR(ap->a_vp, vap, ap->a_cred, ap->a_p);
@@ -661,6 +673,7 @@
 	struct vnode **vpp = ap->a_vpp;
 	struct vnode *dvp = ap->a_dvp;
 	char *pname = cnp->cn_nameptr;
+	struct proc *curp = cnp->cn_proc;
 	struct proc_target *pt;
 	pid_t pid;
 	struct pfsnode *pfs;
@@ -669,7 +682,8 @@
 
 	*vpp = NULL;
 
-	if (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)
+	if (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME ||
+	    cnp->cn_nameiop == CREATE)
 		return (EROFS);
 
 	if (cnp->cn_namelen == 1 && *pname == '.') {
@@ -700,6 +714,9 @@
 		if (p == 0)
 			break;
 
+		if (p_can(curp, p, P_CAN_SEE, NULL))
+			break;
+
 		return (linprocfs_allocvp(dvp->v_mount, vpp, pid, Pproc));
 
 	case Pproc:
@@ -794,7 +811,7 @@
 		p = PFIND(pfs->pfs_pid);
 		if (p == NULL)
 			break;
-		if (!PRISON_CHECK(curproc, p))
+		if (p_can(curproc, p, P_CAN_SEE, NULL))
 			break;
 
 		for (pt = &proc_targets[i];
@@ -829,7 +846,7 @@
 		int doingzomb = 0;
 #endif
 		int pcnt = 0;
-		volatile struct proc *p = allproc.lh_first;
+		struct proc *p = allproc.lh_first;
 
 		for (; p && uio->uio_resid >= delen; i++, pcnt++) {
 			bzero((char *) dp, delen);
@@ -871,11 +888,11 @@
 					p = p->p_list.le_next;
 					if (!p)
 						goto done;
-					if (!PRISON_CHECK(curproc, p))
+					if (p_can(curproc, p, P_CAN_SEE, NULL))
 						continue;
 					pcnt++;
 				}
-				while (!PRISON_CHECK(curproc, p)) {
+				while (p_can(curproc, p, P_CAN_SEE, NULL)) {
 					p = p->p_list.le_next;
 					if (!p)
 						goto done;


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86hf83572x.wl>