diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-04-07 03:11:16 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-04-07 03:11:16 +0000 |
commit | 1e75d64fb5cd7678fdac1a8d8c042b0bce019dd2 (patch) | |
tree | b0bba444bb67352a900d6940f278b3da49fc6880 /pkg/p9/handlers.go | |
parent | 8c065d6fe08cdf2d3429db26747b195ad214f01f (diff) | |
parent | 51e461cf9c49f6ad5a9a68d93c5928647aae11d8 (diff) |
Merge release-20200323.0-77-g51e461c (automated)
Diffstat (limited to 'pkg/p9/handlers.go')
-rw-r--r-- | pkg/p9/handlers.go | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/pkg/p9/handlers.go b/pkg/p9/handlers.go index 2ac45eb80..a8b714cf5 100644 --- a/pkg/p9/handlers.go +++ b/pkg/p9/handlers.go @@ -920,8 +920,15 @@ func (t *Tgetxattr) handle(cs *connState) message { } defer ref.DecRef() - val, err := ref.file.GetXattr(t.Name, t.Size) - if err != nil { + var val string + if err := ref.safelyRead(func() (err error) { + // Don't allow getxattr on files that have been deleted. + if ref.isDeleted() { + return syscall.EINVAL + } + val, err = ref.file.GetXattr(t.Name, t.Size) + return err + }); err != nil { return newErr(err) } return &Rgetxattr{Value: val} @@ -935,7 +942,13 @@ func (t *Tsetxattr) handle(cs *connState) message { } defer ref.DecRef() - if err := ref.file.SetXattr(t.Name, t.Value, t.Flags); err != nil { + if err := ref.safelyWrite(func() error { + // Don't allow setxattr on files that have been deleted. + if ref.isDeleted() { + return syscall.EINVAL + } + return ref.file.SetXattr(t.Name, t.Value, t.Flags) + }); err != nil { return newErr(err) } return &Rsetxattr{} @@ -949,10 +962,18 @@ func (t *Tlistxattr) handle(cs *connState) message { } defer ref.DecRef() - xattrs, err := ref.file.ListXattr(t.Size) - if err != nil { + var xattrs map[string]struct{} + if err := ref.safelyRead(func() (err error) { + // Don't allow listxattr on files that have been deleted. + if ref.isDeleted() { + return syscall.EINVAL + } + xattrs, err = ref.file.ListXattr(t.Size) + return err + }); err != nil { return newErr(err) } + xattrList := make([]string, 0, len(xattrs)) for x := range xattrs { xattrList = append(xattrList, x) @@ -968,7 +989,13 @@ func (t *Tremovexattr) handle(cs *connState) message { } defer ref.DecRef() - if err := ref.file.RemoveXattr(t.Name); err != nil { + if err := ref.safelyWrite(func() error { + // Don't allow removexattr on files that have been deleted. + if ref.isDeleted() { + return syscall.EINVAL + } + return ref.file.RemoveXattr(t.Name) + }); err != nil { return newErr(err) } return &Rremovexattr{} |