diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-04-03 20:44:57 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-04-03 20:44:57 +0000 |
commit | 3ee06d23e6c86e865ec1dc74301624e3d133f8e6 (patch) | |
tree | a735046c4c1dae78b67cb67b892fd547b4fc7b77 /pkg/sentry/kernel/pipe/pipe.go | |
parent | ea8bf7eb7c092854ab75e6ad654f3798e4bbbf67 (diff) | |
parent | a94309628ebbc2e6c4997890f1b966fa7a16be20 (diff) |
Merge release-20200323.0-67-ga943096 (automated)
Diffstat (limited to 'pkg/sentry/kernel/pipe/pipe.go')
-rw-r--r-- | pkg/sentry/kernel/pipe/pipe.go | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/pkg/sentry/kernel/pipe/pipe.go b/pkg/sentry/kernel/pipe/pipe.go index 725e9db7d..62c8691f1 100644 --- a/pkg/sentry/kernel/pipe/pipe.go +++ b/pkg/sentry/kernel/pipe/pipe.go @@ -255,7 +255,8 @@ func (p *Pipe) write(ctx context.Context, ops writeOps) (int64, error) { // POSIX requires that a write smaller than atomicIOBytes (PIPE_BUF) be // atomic, but requires no atomicity for writes larger than this. wanted := ops.left() - if avail := p.max - p.view.Size(); wanted > avail { + avail := p.max - p.view.Size() + if wanted > avail { if wanted <= p.atomicIOBytes { return 0, syserror.ErrWouldBlock } @@ -268,8 +269,14 @@ func (p *Pipe) write(ctx context.Context, ops writeOps) (int64, error) { return done, err } - if wanted > done { - // Partial write due to full pipe. + if done < avail { + // Non-failure, but short write. + return done, nil + } + if done < wanted { + // Partial write due to full pipe. Note that this could also be + // the short write case above, we would expect a second call + // and the write to return zero bytes in this case. return done, syserror.ErrWouldBlock } |