diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2021-04-07 03:23:25 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2021-04-15 09:49:09 +0000 |
commit | f9b923af34a6749c7703b957742f33cc02a485a2 (patch) | |
tree | 49e88d72ac53890dc375c49e2e8ebae5d7ef14ba /sys | |
parent | a5970a529c2d952714f20e4bc6e529c74fd2b3b5 (diff) | |
download | src-f9b923af34a6749c7703b957742f33cc02a485a2.tar.gz src-f9b923af34a6749c7703b957742f33cc02a485a2.zip |
O_PATH: Allow to open symlink
When O_NOFOLLOW is specified, namei() returns the symlink itself. In
this case, open(O_PATH) should be allowed, to denote the location of symlink
itself.
Prevent O_EXEC in this case, execve(2) code is not ready to try to execute
symlinks.
Reported by: wulf
Reviewed by: markj
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D29323
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/vfs_vnops.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 6339295b0556..bb9ee2cceb79 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -385,8 +385,10 @@ vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred, accmode_t accmode; int error; - if (vp->v_type == VLNK) - return (EMLINK); + if (vp->v_type == VLNK) { + if ((fmode & O_PATH) == 0 || (fmode & FEXEC) != 0) + return (EMLINK); + } if (vp->v_type == VSOCK) return (EOPNOTSUPP); if (vp->v_type != VDIR && fmode & O_DIRECTORY) |