From owner-p4-projects@FreeBSD.ORG Thu Jun 21 12:14:30 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 2D46E16A46C; Thu, 21 Jun 2007 12:14:30 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id B3D7816A421 for ; Thu, 21 Jun 2007 12:14:29 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id A4A0B13C44C for ; Thu, 21 Jun 2007 12:14:29 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l5LCETaY052463 for ; Thu, 21 Jun 2007 12:14:29 GMT (envelope-from rdivacky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l5LCETSf052457 for perforce@freebsd.org; Thu, 21 Jun 2007 12:14:29 GMT (envelope-from rdivacky@FreeBSD.org) Date: Thu, 21 Jun 2007 12:14:29 GMT Message-Id: <200706211214.l5LCETSf052457@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to rdivacky@FreeBSD.org using -f From: Roman Divacky To: Perforce Change Reviews Cc: Subject: PERFORCE change 122090 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Jun 2007 12:14:30 -0000 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 #include +#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 */ /*