diff options
author | Jamie Liu <jamieliu@google.com> | 2018-07-10 13:58:00 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2018-07-10 13:58:54 -0700 |
commit | 06920b3d1bb6346a20aa0e154b14e68116919dbc (patch) | |
tree | 4e70e7ce124368765fa99d115e6b9e104554cfb8 | |
parent | bf580cf64dbea1c70a3269914fad6490f7a4968d (diff) |
Exit tmpfs.fileInodeOperations.Translate early if required.Start >= EOF.
Otherwise required and optional can be empty or have negative length.
PiperOrigin-RevId: 204007079
Change-Id: I59e472a87a8caac11ffb9a914b8d79bf0cd70995
-rw-r--r-- | pkg/sentry/fs/tmpfs/inode_file.go | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/pkg/sentry/fs/tmpfs/inode_file.go b/pkg/sentry/fs/tmpfs/inode_file.go index 66bc934ae..4e803c9ff 100644 --- a/pkg/sentry/fs/tmpfs/inode_file.go +++ b/pkg/sentry/fs/tmpfs/inode_file.go @@ -451,9 +451,12 @@ func (f *fileInodeOperations) Translate(ctx context.Context, required, optional // Constrain translations to f.attr.Unstable.Size (rounded up) to prevent // translation to pages that may be concurrently truncated. pgend := fs.OffsetPageEnd(f.attr.Unstable.Size) - var buserr error + var beyondEOF bool if required.End > pgend { - buserr = &memmap.BusError{io.EOF} + if required.Start >= pgend { + return nil, &memmap.BusError{io.EOF} + } + beyondEOF = true required.End = pgend } if optional.End > pgend { @@ -481,9 +484,12 @@ func (f *fileInodeOperations) Translate(ctx context.Context, required, optional // Don't return the error returned by f.data.Fill if it occurred outside of // required. if translatedEnd < required.End && cerr != nil { - return ts, cerr + return ts, &memmap.BusError{cerr} + } + if beyondEOF { + return ts, &memmap.BusError{io.EOF} } - return ts, buserr + return ts, nil } // InvalidateUnsavable implements memmap.Mappable.InvalidateUnsavable. |