Subject: please test linux programs with latest procfs
To: None <current-users@netbsd.org, port-i386@netbsd.org>
From: Antti Kantee <pooka@cs.hut.fi>
List: port-i386
Date: 07/22/2007 16:40:18
--Nq2Wo0NMKNjxTN9z
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

Hi,

I committed a workaround to kern/36669 which loses some information
in procfs.  While this shouldn't affect any valid use of procfs, you
can never be too sure.  Please test linux programs and procfs_vnops.c
revision 1.158.

If you run netbsd-4, it is even more important that you test.  Please
apply the attached patch.

In case there are no complaints, this patch is going into the (hopefully
imminent) NetBSD 4.0 release to workaround a "any user can panic the
system" situation.

thanks,
  antti

-- 
Antti Kantee <pooka@iki.fi>                     Of course he runs NetBSD
http://www.iki.fi/pooka/                          http://www.NetBSD.org/
    "la qualité la plus indispensable du cuisinier est l'exactitude"

--Nq2Wo0NMKNjxTN9z
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=procfs_patch-netbsd-4

Index: procfs_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/miscfs/procfs/procfs_vnops.c,v
retrieving revision 1.140.2.5
diff -p -u -r1.140.2.5 procfs_vnops.c
--- procfs_vnops.c	31 Mar 2007 16:13:18 -0000	1.140.2.5
+++ procfs_vnops.c	22 Jul 2007 11:53:08 -0000
@@ -537,6 +537,18 @@ procfs_dir(pfstype t, struct lwp *caller
 		return (NULL);
 	}
 
+	/*
+	 * XXX: this horrible kludge avoids locking panics when
+	 * attempting to lookup links that point to within procfs
+	 */
+	if (vp != NULL && vp->v_tag == VT_PROCFS) {
+		if (bpp) {
+			*--bp = '/';
+			*bpp = bp;
+		}
+		return vp;
+	}
+
 	if (rvp == NULL)
 		rvp = rootvnode;
 	if (vp == NULL || getcwd_common(vp, rvp, bp ? &bp : NULL, path,
@@ -1451,11 +1463,20 @@ procfs_readlink(v)
 			}
 			bp = path + MAXPATHLEN;
 			*--bp = '\0';
-			vp = curproc->p_cwdi->cwdi_rdir;
-			if (vp == NULL)
-				vp = rootvnode;
-			error = getcwd_common(vxp, vp, &bp, path,
-			    MAXPATHLEN / 2, 0, curlwp);
+
+ 			/*
+ 			 * XXX: kludge to avoid locking against ourselves
+ 			 * in getcwd()
+ 			 */
+ 			if (vxp->v_tag == VT_PROCFS) {
+ 				*--bp = '/';
+ 			} else {
+ 				vp = curproc->p_cwdi->cwdi_rdir; /* XXXSMP */
+ 				if (vp == NULL)
+ 					vp = rootvnode;
+ 				error = getcwd_common(vxp, vp, &bp, path,
+ 				    MAXPATHLEN / 2, 0, curlwp);
+ 			}
 			FILE_UNUSE(fp, proc_representative_lwp(pown));
 			if (error) {
 				free(path, M_TEMP);

--Nq2Wo0NMKNjxTN9z--