mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Open(2) isn't honoring O_NOFOLLOW
PiperOrigin-RevId: 211644897 Change-Id: I882ed827a477d6c03576463ca5bf2d6351892b90
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user