diff options
Diffstat (limited to 'pkg/sentry')
-rw-r--r-- | pkg/sentry/fs/file.go | 6 | ||||
-rw-r--r-- | pkg/sentry/kernel/pipe/node_test.go | 4 | ||||
-rw-r--r-- | pkg/sentry/kernel/task_block.go | 5 |
3 files changed, 15 insertions, 0 deletions
diff --git a/pkg/sentry/fs/file.go b/pkg/sentry/fs/file.go index 8f1baca23..8c1307235 100644 --- a/pkg/sentry/fs/file.go +++ b/pkg/sentry/fs/file.go @@ -516,12 +516,18 @@ type lockedReader struct { // Read implements io.Reader.Read. func (r *lockedReader) Read(buf []byte) (int, error) { + if r.Ctx.Interrupted() { + return 0, syserror.ErrInterrupted + } n, err := r.File.FileOperations.Read(r.Ctx, r.File, usermem.BytesIOSequence(buf), r.File.offset) return int(n), err } // ReadAt implements io.Reader.ReadAt. func (r *lockedReader) ReadAt(buf []byte, offset int64) (int, error) { + if r.Ctx.Interrupted() { + return 0, syserror.ErrInterrupted + } n, err := r.File.FileOperations.Read(r.Ctx, r.File, usermem.BytesIOSequence(buf), offset) return int(n), err } diff --git a/pkg/sentry/kernel/pipe/node_test.go b/pkg/sentry/kernel/pipe/node_test.go index 7ddecdad8..31d9b0443 100644 --- a/pkg/sentry/kernel/pipe/node_test.go +++ b/pkg/sentry/kernel/pipe/node_test.go @@ -48,6 +48,10 @@ func (s *sleeper) Cancel() { s.ch <- struct{}{} } +func (s *sleeper) Interrupted() bool { + return len(s.ch) != 0 +} + type openResult struct { *fs.File error diff --git a/pkg/sentry/kernel/task_block.go b/pkg/sentry/kernel/task_block.go index 30a7f6b1e..1c76c4d84 100644 --- a/pkg/sentry/kernel/task_block.go +++ b/pkg/sentry/kernel/task_block.go @@ -158,6 +158,11 @@ func (t *Task) SleepFinish(success bool) { t.Activate() } +// Interrupted implements amutex.Sleeper.Interrupted +func (t *Task) Interrupted() bool { + return len(t.interruptChan) != 0 +} + // UninterruptibleSleepStart implements context.Context.UninterruptibleSleepStart. func (t *Task) UninterruptibleSleepStart(deactivate bool) { if deactivate { |