diff options
author | gVisor bot <gvisor-bot@google.com> | 2019-10-16 21:54:52 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2019-10-16 21:54:52 +0000 |
commit | cde805cabdf5e82c40a7f1b7e3e846a828ffe22a (patch) | |
tree | 9f043d0a93a8b3a8dc26c06520074fdf42f2c9db /pkg/sentry/socket/unix/transport/queue.go | |
parent | 3151bfa70a20b4536c0a4d1492facc117281fa4f (diff) | |
parent | d22f0534c07a2b1a21cecb88db80cbc662bbd5af (diff) |
Merge release-20190806.1-278-gd22f053 (automated)
Diffstat (limited to 'pkg/sentry/socket/unix/transport/queue.go')
-rw-r--r-- | pkg/sentry/socket/unix/transport/queue.go | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/pkg/sentry/socket/unix/transport/queue.go b/pkg/sentry/socket/unix/transport/queue.go index 0415fae9a..e27b1c714 100644 --- a/pkg/sentry/socket/unix/transport/queue.go +++ b/pkg/sentry/socket/unix/transport/queue.go @@ -33,6 +33,7 @@ type queue struct { mu sync.Mutex `state:"nosave"` closed bool + unread bool used int64 limit int64 dataList messageList @@ -161,6 +162,9 @@ func (q *queue) Dequeue() (e *message, notify bool, err *syserr.Error) { err := syserr.ErrWouldBlock if q.closed { err = syserr.ErrClosedForReceive + if q.unread { + err = syserr.ErrConnectionReset + } } q.mu.Unlock() @@ -188,7 +192,9 @@ func (q *queue) Peek() (*message, *syserr.Error) { if q.dataList.Front() == nil { err := syserr.ErrWouldBlock if q.closed { - err = syserr.ErrClosedForReceive + if err = syserr.ErrClosedForReceive; q.unread { + err = syserr.ErrConnectionReset + } } return nil, err } @@ -208,3 +214,11 @@ func (q *queue) QueuedSize() int64 { func (q *queue) MaxQueueSize() int64 { return q.limit } + +// CloseUnread sets flag to indicate that the peer is closed (not shutdown) +// with unread data. So if read on this queue shall return ECONNRESET error. +func (q *queue) CloseUnread() { + q.mu.Lock() + defer q.mu.Unlock() + q.unread = true +} |