diff options
author | gVisor bot <gvisor-bot@google.com> | 2021-05-03 20:54:38 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-05-03 20:54:38 +0000 |
commit | 7e08899808dd1fb223add55875237e9389268e21 (patch) | |
tree | 2dfd65bb5b74a2058996df6d43400d155f196740 /pkg/sentry/fsimpl/kernfs/filesystem.go | |
parent | c8eee758e7e9ed96c651d4b002f720eaccc65db4 (diff) | |
parent | 1947c873423cabcaf5e67b667542421ade7414ff (diff) |
Merge release-20210419.0-52-g1947c8734 (automated)
Diffstat (limited to 'pkg/sentry/fsimpl/kernfs/filesystem.go')
-rw-r--r-- | pkg/sentry/fsimpl/kernfs/filesystem.go | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/pkg/sentry/fsimpl/kernfs/filesystem.go b/pkg/sentry/fsimpl/kernfs/filesystem.go index badca4d9f..f50b0fb08 100644 --- a/pkg/sentry/fsimpl/kernfs/filesystem.go +++ b/pkg/sentry/fsimpl/kernfs/filesystem.go @@ -612,16 +612,24 @@ afterTrailingSymlink: // ReadlinkAt implements vfs.FilesystemImpl.ReadlinkAt. func (fs *Filesystem) ReadlinkAt(ctx context.Context, rp *vfs.ResolvingPath) (string, error) { - fs.mu.RLock() defer fs.processDeferredDecRefs(ctx) - defer fs.mu.RUnlock() + + fs.mu.RLock() d, err := fs.walkExistingLocked(ctx, rp) if err != nil { + fs.mu.RUnlock() return "", err } if !d.isSymlink() { + fs.mu.RUnlock() return "", syserror.EINVAL } + + // Inode.Readlink() cannot be called holding fs locks. + d.IncRef() + defer d.DecRef(ctx) + fs.mu.RUnlock() + return d.inode.Readlink(ctx, rp.Mount()) } |