PERFORCE change 122088 for review
Roman Divacky
rdivacky at FreeBSD.org
Thu Jun 21 11:28:30 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=122088
Change 122088 by rdivacky at rdivacky_witten on 2007/06/21 11:27:47
Check for absolute path in namei() when startdir is NULL when
called from *at context.
Affected files ...
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_lookup.c#6 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#24 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/namei.h#5 edit
Differences ...
==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_lookup.c#6 (text+ko) ====
@@ -195,8 +195,12 @@
if (ndp->ni_startdir)
dp = ndp->ni_startdir;
- else
+ else {
dp = fdp->fd_cdir;
+ /* we might have raced so check it */
+ if ((cnp->cn_flags & AT) && (cnp->cn_pnbuf[0] != '/'))
+ return (EBADF);
+ }
vfslocked = VFS_LOCK_GIANT(dp->v_mount);
VREF(dp);
FILEDESC_SUNLOCK(fdp);
==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#24 (text+ko) ====
@@ -1027,7 +1027,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
- NDINIT_AT(&nd, LOOKUP, FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td, dir_vn);
+ NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td, dir_vn);
if ((flags & O_ACCMODE) == O_ACCMODE) {
error = EINVAL;
@@ -1244,7 +1244,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
bwillwrite();
- NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
+ NDINIT_AT(&nd, CREATE, AT | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
pathseg, path, td, dir_vn);
if ((error = namei(&nd)) != 0) {
if (dir_vn)
@@ -1371,7 +1371,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
bwillwrite();
- NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
+ NDINIT_AT(&nd, CREATE, AT | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
pathseg, path, td, dir_vn);
if ((error = namei(&nd)) != 0) {
if (dir_vn)
@@ -1513,13 +1513,13 @@
if (error && !kern_absolute_path(path, segflg))
return (error);
- NDINIT_AT(&ndp, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, segflg, path, td, pdir_vn);
+ NDINIT_AT(&ndp, LOOKUP, AT | 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, LOCKPARENT | SAVENAME| MPSAFE | AUDITVNODE1, segflg,
+ NDINIT_AT(&ndl, CREATE, AT | LOCKPARENT | SAVENAME| MPSAFE | AUDITVNODE1, segflg,
link, td, ldir_vn);
bwillwrite();
@@ -1632,7 +1632,7 @@
if (error && !kern_absolute_path(link, segflg))
return (error);
bwillwrite();
- NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
+ NDINIT_AT(&nd, CREATE, AT | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
segflg, link, td, dir_vn);
if ((error = namei(&nd)) != 0)
goto out;
@@ -1781,7 +1781,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
bwillwrite();
- NDINIT_AT(&nd, DELETE, LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1,
+ NDINIT_AT(&nd, DELETE, AT | LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1,
pathseg, path, td, dir_vn);
if ((error = namei(&nd)) != 0) {
if (dir_vn)
@@ -2055,7 +2055,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
- NDINIT_AT(&nd, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1,
+ NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1,
pathseg, path, td, dir_vn);
/*
@@ -2265,7 +2265,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
- NDINIT_AT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1 |
+ NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1 |
MPSAFE, pathseg, path, td, dir_vn);
if ((error = namei(&nd)) != 0)
@@ -2334,7 +2334,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
- NDINIT_AT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | LOCKSHARED | AUDITVNODE1 |
+ NDINIT_AT(&nd, LOOKUP, AT | NOFOLLOW | LOCKLEAF | LOCKSHARED | AUDITVNODE1 |
MPSAFE, pathseg, path, td, dir_vn);
if ((error = namei(&nd)) != 0)
@@ -2527,7 +2527,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
- NDINIT_AT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, pathseg,
+ NDINIT_AT(&nd, LOOKUP, AT | NOFOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, pathseg,
path, td, dir_vn);
if ((error = namei(&nd)) != 0)
@@ -2774,7 +2774,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
- NDINIT_AT(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
+ NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
if ((error = namei(&nd)) != 0)
goto out;
@@ -2934,7 +2934,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
- NDINIT_AT(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
+ NDINIT_AT(&nd, LOOKUP, AT | FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
if ((error = namei(&nd)) != 0)
goto out;
@@ -2991,7 +2991,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
- NDINIT_AT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
+ NDINIT_AT(&nd, LOOKUP, AT | NOFOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn);
if ((error = namei(&nd)) != 0)
goto out;
@@ -3165,7 +3165,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
- NDINIT_AT(&nd, LOOKUP, FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td, dir_vn);
+ NDINIT_AT(&nd, LOOKUP, AT |FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td, dir_vn);
if ((error = getutimes(tptr, tptrseg, ts)) != 0)
goto out;
@@ -3551,13 +3551,13 @@
return (error);
#ifdef MAC
- NDINIT_AT(&fromnd, DELETE, LOCKPARENT | LOCKLEAF | SAVESTART | MPSAFE |
+ NDINIT_AT(&fromnd, DELETE, AT | LOCKPARENT | LOCKLEAF | SAVESTART | MPSAFE |
AUDITVNODE1, pathseg, from, td, fdir_vn);
#else
- NDINIT_AT(&fromnd, DELETE, WANTPARENT | SAVESTART | MPSAFE |
+ NDINIT_AT(&fromnd, DELETE, AT | WANTPARENT | SAVESTART | MPSAFE |
AUDITVNODE1, pathseg, from, td, fdir_vn);
#endif
- NDINIT_AT(&tond, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART |
+ NDINIT_AT(&tond, RENAME, AT | LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART |
MPSAFE | AUDITVNODE2, pathseg, to, td, tdir_vn);
bwillwrite();
@@ -3706,7 +3706,7 @@
if (error && !kern_absolute_path(path, segflg))
return (error);
bwillwrite();
- NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
+ NDINIT_AT(&nd, CREATE, AT | LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1,
segflg, path, td, dir_vn);
nd.ni_cnd.cn_flags |= WILLBEDIR;
if ((error = namei(&nd)) != 0) {
@@ -3810,7 +3810,7 @@
if (error && !kern_absolute_path(path, pathseg))
return (error);
bwillwrite();
- NDINIT_AT(&nd, DELETE, LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1,
+ NDINIT_AT(&nd, DELETE, AT | 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#5 (text+ko) ====
@@ -109,8 +109,9 @@
#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 NOFOLLOW 0x0000 /* do not follow symbolic links (pseudo) */
-#define MODMASK 0x01fc /* mask of operational modifiers */
+#define MODMASK 0x03fc /* mask of operational modifiers */
/*
* Namei parameter descriptors.
*
More information about the p4-projects
mailing list