diff options
author | gVisor bot <gvisor-bot@google.com> | 2021-02-24 23:47:08 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-02-24 23:47:08 +0000 |
commit | 22288b9dcb648c3acd282cd5e8eade3890a73dc6 (patch) | |
tree | 9d84bcf13bac9a19ab84680caf5d8e336bf6fb92 | |
parent | 84331bb24cd817797b0e15fcde6c0e86bb5706e2 (diff) | |
parent | f5692f7dcc48a76a5d7b45cdf71b59be876adb42 (diff) |
Merge release-20210208.0-92-gf5692f7dc (automated)
-rw-r--r-- | pkg/sentry/fsimpl/kernfs/filesystem.go | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/pkg/sentry/fsimpl/kernfs/filesystem.go b/pkg/sentry/fsimpl/kernfs/filesystem.go index beb9302f6..badca4d9f 100644 --- a/pkg/sentry/fsimpl/kernfs/filesystem.go +++ b/pkg/sentry/fsimpl/kernfs/filesystem.go @@ -668,14 +668,14 @@ func (fs *Filesystem) RenameAt(ctx context.Context, rp *vfs.ResolvingPath, oldPa // Can we create the dst dentry? var dst *Dentry - pc := rp.Component() - if pc == "." || pc == ".." { + newName := rp.Component() + if newName == "." || newName == ".." { if noReplace { return syserror.EEXIST } return syserror.EBUSY } - switch err := checkCreateLocked(ctx, rp.Credentials(), pc, dstDir); err { + switch err := checkCreateLocked(ctx, rp.Credentials(), newName, dstDir); err { case nil: // Ok, continue with rename as replacement. case syserror.EEXIST: @@ -683,13 +683,18 @@ func (fs *Filesystem) RenameAt(ctx context.Context, rp *vfs.ResolvingPath, oldPa // Won't overwrite existing node since RENAME_NOREPLACE was requested. return syserror.EEXIST } - dst = dstDir.children[pc] + dst = dstDir.children[newName] if dst == nil { - panic(fmt.Sprintf("Child %q for parent Dentry %+v disappeared inside atomic section?", pc, dstDir)) + panic(fmt.Sprintf("Child %q for parent Dentry %+v disappeared inside atomic section?", newName, dstDir)) } default: return err } + + if srcDir == dstDir && oldName == newName { + return nil + } + var dstVFSD *vfs.Dentry if dst != nil { dstVFSD = dst.VFSDentry() @@ -712,7 +717,7 @@ func (fs *Filesystem) RenameAt(ctx context.Context, rp *vfs.ResolvingPath, oldPa if err := virtfs.PrepareRenameDentry(mntns, srcVFSD, dstVFSD); err != nil { return err } - err = srcDir.inode.Rename(ctx, src.name, pc, src.inode, dstDir.inode) + err = srcDir.inode.Rename(ctx, src.name, newName, src.inode, dstDir.inode) if err != nil { virtfs.AbortRenameDentry(srcVFSD, dstVFSD) return err @@ -723,12 +728,12 @@ func (fs *Filesystem) RenameAt(ctx context.Context, rp *vfs.ResolvingPath, oldPa dstDir.IncRef() // child (src) takes a ref on the new parent. } src.parent = dstDir - src.name = pc + src.name = newName if dstDir.children == nil { dstDir.children = make(map[string]*Dentry) } - replaced := dstDir.children[pc] - dstDir.children[pc] = src + replaced := dstDir.children[newName] + dstDir.children[newName] = src var replaceVFSD *vfs.Dentry if replaced != nil { // deferDecRef so that fs.mu and dstDir.mu are unlocked by then. |