Open(2) isn't honoring O_NOFOLLOW

PiperOrigin-RevId: 211644897
Change-Id: I882ed827a477d6c03576463ca5bf2d6351892b90
This commit is contained in:
Brian Geffon
2018-09-05 09:21:28 -07:00
committed by Shentubot
parent 0a9a40abcd
commit 2b8dae0bc5
2 changed files with 7 additions and 1 deletions
+1
View File
@@ -37,6 +37,7 @@ const (
O_DIRECT = 00040000
O_LARGEFILE = 00100000
O_DIRECTORY = 00200000
O_NOFOLLOW = 00400000
O_CLOEXEC = 02000000
O_SYNC = 04010000
O_PATH = 010000000
+6 -1
View File
@@ -136,7 +136,8 @@ func openAt(t *kernel.Task, dirFD kdefs.FD, addr usermem.Addr, flags uint) (fd u
return 0, err
}
err = fileOpOn(t, dirFD, path, true /* resolve */, func(root *fs.Dirent, d *fs.Dirent) error {
resolve := flags&linux.O_NOFOLLOW == 0
err = fileOpOn(t, dirFD, path, resolve, func(root *fs.Dirent, d *fs.Dirent) error {
// First check a few things about the filesystem before trying to get the file
// reference.
//
@@ -147,6 +148,10 @@ func openAt(t *kernel.Task, dirFD kdefs.FD, addr usermem.Addr, flags uint) (fd u
return err
}
if fs.IsSymlink(d.Inode.StableAttr) && !resolve {
return syserror.ELOOP
}
fileFlags := linuxToFlags(flags)
// Linux always adds the O_LARGEFILE flag when running in 64-bit mode.
fileFlags.LargeFile = true