Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Jun 2007 12:14:29 GMT
From:      Roman Divacky <rdivacky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 122090 for review
Message-ID:  <200706211214.l5LCETSf052457@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=122090

Change 122090 by rdivacky@rdivacky_witten on 2007/06/21 12:13:32

	Change AT to ATBADF meaning that we were passed an illegal dirfd but we carried
	on because we had absolute path. Check for this flag in namei().
	
	Also note that the kern_absolute_path() is necessary (unlike the previous mail says)
	beacuse we want to distinguish various errors from just "bad file".

Affected files ...

.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_lookup.c#7 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#25 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/namei.h#6 edit

Differences ...

==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_lookup.c#7 (text+ko) ====

@@ -198,7 +198,7 @@
 	else {
 		dp = fdp->fd_cdir;
 		/* we might have raced so check it */
-		if ((cnp->cn_flags & AT) && (cnp->cn_pnbuf[0] != '/'))
+		if ((cnp->cn_flags & ATBADF) && (cnp->cn_pnbuf[0] != '/'))
 			return (EBADF);
 	}
 	vfslocked = VFS_LOCK_GIANT(dp->v_mount);

==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#25 (text+ko) ====

@@ -78,6 +78,8 @@
 #include <vm/vm_page.h>
 #include <vm/uma.h>
 
+#define	ATBAD	((error) ? ATBADF : 0)
+
 static int chroot_refuse_vdir_fds(struct filedesc *fdp);
 static int getutimes(const struct timeval *, enum uio_seg, struct timespec *);
 static int setfown(struct thread *td, struct vnode *, uid_t, gid_t);
@@ -1027,7 +1029,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 
-	NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td, dir_vn);
+	NDINIT_AT(&nd, LOOKUP, ATBAD | FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td, dir_vn);
 
 	if ((flags & O_ACCMODE) == O_ACCMODE) {
 		error = EINVAL;
@@ -1244,7 +1246,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 	bwillwrite();
-	NDINIT_AT(&nd, CREATE, AT | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
+	NDINIT_AT(&nd, CREATE, ATBAD | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
 	    pathseg, path, td, dir_vn);
 	if ((error = namei(&nd)) != 0) {
 		if (dir_vn)
@@ -1371,7 +1373,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 	bwillwrite();
-	NDINIT_AT(&nd, CREATE, AT | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
+	NDINIT_AT(&nd, CREATE, ATBAD | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
 	    pathseg, path, td, dir_vn);
 	if ((error = namei(&nd)) != 0) {
 		if (dir_vn)
@@ -1513,13 +1515,13 @@
 	if (error && !kern_absolute_path(path, segflg))
 		return (error);
 
-	NDINIT_AT(&ndp, LOOKUP, AT | FOLLOW | MPSAFE | AUDITVNODE1, segflg, path, td, pdir_vn);
+	NDINIT_AT(&ndp, LOOKUP, ATBAD | FOLLOW | MPSAFE | AUDITVNODE1, segflg, path, td, pdir_vn);
 
 	error = kern_get_at(td, newdirfd, &ldir_vn);
 	if (error && !kern_absolute_path(link, segflg))
 		return (error);
 
-	NDINIT_AT(&ndl, CREATE, AT | LOCKPARENT | SAVENAME| MPSAFE | AUDITVNODE1, segflg,
+	NDINIT_AT(&ndl, CREATE, ATBAD | LOCKPARENT | SAVENAME| MPSAFE | AUDITVNODE1, segflg,
 		link, td, ldir_vn);
 
 	bwillwrite();
@@ -1632,7 +1634,7 @@
 	if (error && !kern_absolute_path(link, segflg))
 		return (error);
 	bwillwrite();
-	NDINIT_AT(&nd, CREATE, AT | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
+	NDINIT_AT(&nd, CREATE, ATBAD | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
 	    segflg, link, td, dir_vn);
 	if ((error = namei(&nd)) != 0)
 		goto out;
@@ -1781,7 +1783,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 	bwillwrite();
-	NDINIT_AT(&nd, DELETE, AT | LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1,
+	NDINIT_AT(&nd, DELETE, ATBAD | LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1,
 	    pathseg, path, td, dir_vn);
 	if ((error = namei(&nd)) != 0) {
 		if (dir_vn)
@@ -2055,7 +2057,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 
-	NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1,
+	NDINIT_AT(&nd, LOOKUP, ATBAD | FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1,
 	    pathseg, path, td, dir_vn);
 
 	/*
@@ -2265,7 +2267,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 
-	NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1 | 
+	NDINIT_AT(&nd, LOOKUP, ATBAD | FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1 | 
 		MPSAFE, pathseg, path, td, dir_vn);
 
 	if ((error = namei(&nd)) != 0)
@@ -2334,7 +2336,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 
-	NDINIT_AT(&nd, LOOKUP, AT | NOFOLLOW | LOCKLEAF | LOCKSHARED | AUDITVNODE1 | 
+	NDINIT_AT(&nd, LOOKUP, ATBAD | NOFOLLOW | LOCKLEAF | LOCKSHARED | AUDITVNODE1 | 
 		MPSAFE, pathseg, path, td, dir_vn);
 
 	if ((error = namei(&nd)) != 0)
@@ -2527,7 +2529,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 
-	NDINIT_AT(&nd, LOOKUP, AT | NOFOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, pathseg,
+	NDINIT_AT(&nd, LOOKUP, ATBAD | NOFOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, pathseg,
 		path, td, dir_vn);
 
 	if ((error = namei(&nd)) != 0)
@@ -2774,7 +2776,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 
-	NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
+	NDINIT_AT(&nd, LOOKUP, ATBAD | FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
 
 	if ((error = namei(&nd)) != 0)
 		goto out;
@@ -2934,7 +2936,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 
-	NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
+	NDINIT_AT(&nd, LOOKUP, ATBAD | FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
 
 	if ((error = namei(&nd)) != 0)
 		goto out;
@@ -2991,7 +2993,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 
-	NDINIT_AT(&nd, LOOKUP, AT | NOFOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
+	NDINIT_AT(&nd, LOOKUP, ATBAD | NOFOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
 
 	if ((error = namei(&nd)) != 0)
 		goto out;
@@ -3165,7 +3167,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 
-	NDINIT_AT(&nd, LOOKUP, AT |FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td, dir_vn);
+	NDINIT_AT(&nd, LOOKUP, ATBAD |FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td, dir_vn);
 
 	if ((error = getutimes(tptr, tptrseg, ts)) != 0)
 		goto out;
@@ -3551,13 +3553,13 @@
 		return (error);
 
 #ifdef MAC
-	NDINIT_AT(&fromnd, DELETE, AT | LOCKPARENT | LOCKLEAF | SAVESTART | MPSAFE |
+	NDINIT_AT(&fromnd, DELETE, ATBAD | LOCKPARENT | LOCKLEAF | SAVESTART | MPSAFE |
 	    AUDITVNODE1, pathseg, from, td, fdir_vn);
 #else
-	NDINIT_AT(&fromnd, DELETE, AT | WANTPARENT | SAVESTART | MPSAFE |
+	NDINIT_AT(&fromnd, DELETE, ATBAD | WANTPARENT | SAVESTART | MPSAFE |
 	    AUDITVNODE1, pathseg, from, td, fdir_vn);
 #endif
-	NDINIT_AT(&tond, RENAME, AT | LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART |
+	NDINIT_AT(&tond, RENAME, ATBAD | LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART |
 	    MPSAFE | AUDITVNODE2, pathseg, to, td, tdir_vn);
 
 	bwillwrite();
@@ -3706,7 +3708,7 @@
 	if (error && !kern_absolute_path(path, segflg))
 		return (error);
 	bwillwrite();
-	NDINIT_AT(&nd, CREATE, AT | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
+	NDINIT_AT(&nd, CREATE, ATBAD | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
 	    segflg, path, td, dir_vn);
 	nd.ni_cnd.cn_flags |= WILLBEDIR;
 	if ((error = namei(&nd)) != 0) {
@@ -3810,7 +3812,7 @@
 	if (error && !kern_absolute_path(path, pathseg))
 		return (error);
 	bwillwrite();
-	NDINIT_AT(&nd, DELETE, AT | LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1,
+	NDINIT_AT(&nd, DELETE, ATBAD | LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1,
 	    pathseg, path, td, dir_vn);
 	if ((error = namei(&nd)) != 0)
 		return (error);

==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/namei.h#6 (text+ko) ====

@@ -109,7 +109,7 @@
 #define	NOCACHE		0x0020	/* name must not be left in cache */
 #define	FOLLOW		0x0040	/* follow symbolic links */
 #define	LOCKSHARED	0x0100	/* Shared lock leaf */
-#define	AT		0x0200	/* called from *at context */
+#define	ATBADF		0x0200	/* called from *at context with invalid dirfd */
 #define	NOFOLLOW	0x0000	/* do not follow symbolic links (pseudo) */
 #define	MODMASK		0x03fc	/* mask of operational modifiers */
 /*



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