mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Do not require O_PATH flag to enable verity
Remove the hack in gVisor vfs that allows verity to bypass the O_PATH check, since ioctl is not allowed on fds opened with O_PATH in linux. Verity still opens the lowerFD with O_PATH to open it as a symlink, but the API no longer expects O_PATH to open a fd to be verity enabled. Now only O_FOLLOW should be specified when opening and enabling verity features. PiperOrigin-RevId: 384567833
This commit is contained in:
@@ -851,11 +851,18 @@ func (d *dentry) openLocked(ctx context.Context, rp *vfs.ResolvingPath, opts *vf
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tmpOpts := *opts
|
||||
|
||||
// Open the lowerFD with O_PATH if a symlink is opened for verity.
|
||||
if tmpOpts.Flags&linux.O_NOFOLLOW != 0 && d.isSymlink() {
|
||||
tmpOpts.Flags |= linux.O_PATH
|
||||
}
|
||||
|
||||
// Open the file in the underlying file system.
|
||||
lowerFD, err := rp.VirtualFilesystem().OpenAt(ctx, d.fs.creds, &vfs.PathOperation{
|
||||
Root: d.lowerVD,
|
||||
Start: d.lowerVD,
|
||||
}, opts)
|
||||
}, &tmpOpts)
|
||||
|
||||
// The file should exist, as we succeeded in finding its dentry. If it's
|
||||
// missing, it indicates an unexpected modification to the file system.
|
||||
@@ -893,7 +900,6 @@ func (d *dentry) openLocked(ctx context.Context, rp *vfs.ResolvingPath, opts *vf
|
||||
// be called if a verity FD is successfully created.
|
||||
defer merkleReader.DecRef(ctx)
|
||||
|
||||
lowerFlags := lowerFD.StatusFlags()
|
||||
lowerFDOpts := lowerFD.Options()
|
||||
var merkleWriter *vfs.FileDescription
|
||||
var parentMerkleWriter *vfs.FileDescription
|
||||
@@ -946,7 +952,7 @@ func (d *dentry) openLocked(ctx context.Context, rp *vfs.ResolvingPath, opts *vf
|
||||
isDir: d.isDir(),
|
||||
}
|
||||
|
||||
if err := fd.vfsfd.Init(fd, lowerFlags, rp.Mount(), &d.vfsd, &lowerFDOpts); err != nil {
|
||||
if err := fd.vfsfd.Init(fd, opts.Flags, rp.Mount(), &d.vfsd, &lowerFDOpts); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
lowerFD.IncRef()
|
||||
|
||||
@@ -899,7 +899,7 @@ func TestUnmodifiedSymlinkFileReadSucceeds(t *testing.T) {
|
||||
t.Fatalf("SymlinkAt: %v", err)
|
||||
}
|
||||
|
||||
fd, err := openVerityAt(ctx, vfsObj, root, symlink, linux.O_PATH|linux.O_NOFOLLOW, linux.ModeRegular)
|
||||
fd, err := openVerityAt(ctx, vfsObj, root, symlink, linux.O_NOFOLLOW, linux.ModeRegular)
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("openVerityAt symlink: %v", err)
|
||||
@@ -1034,7 +1034,7 @@ func TestDeletedSymlinkFileReadFails(t *testing.T) {
|
||||
t.Fatalf("SymlinkAt: %v", err)
|
||||
}
|
||||
|
||||
fd, err := openVerityAt(ctx, vfsObj, root, symlink, linux.O_PATH|linux.O_NOFOLLOW, linux.ModeRegular)
|
||||
fd, err := openVerityAt(ctx, vfsObj, root, symlink, linux.O_NOFOLLOW, linux.ModeRegular)
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("openVerityAt symlink: %v", err)
|
||||
@@ -1136,7 +1136,7 @@ func TestModifiedSymlinkFileReadFails(t *testing.T) {
|
||||
}
|
||||
|
||||
// Open symlink file to get the fd for ioctl in new step.
|
||||
fd, err := openVerityAt(ctx, vfsObj, root, symlink, linux.O_PATH|linux.O_NOFOLLOW, linux.ModeRegular)
|
||||
fd, err := openVerityAt(ctx, vfsObj, root, symlink, linux.O_NOFOLLOW, linux.ModeRegular)
|
||||
if err != nil {
|
||||
t.Fatalf("OpenAt symlink: %v", err)
|
||||
}
|
||||
|
||||
@@ -427,9 +427,7 @@ func (vfs *VirtualFilesystem) OpenAt(ctx context.Context, creds *auth.Credential
|
||||
if opts.Flags&linux.O_DIRECTORY != 0 {
|
||||
rp.mustBeDir = true
|
||||
}
|
||||
// Ignore O_PATH for verity, as verity performs extra operations on the fd for verification.
|
||||
// The underlying filesystem that verity wraps opens the fd with O_PATH.
|
||||
if opts.Flags&linux.O_PATH != 0 && rp.mount.fs.FilesystemType().Name() != "verity" {
|
||||
if opts.Flags&linux.O_PATH != 0 {
|
||||
vd, err := vfs.GetDentryAt(ctx, creds, pop, &GetDentryOptions{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
Reference in New Issue
Block a user