summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/socket/unix/transport/queue.go
diff options
context:
space:
mode:
authorgVisor bot <gvisor-bot@google.com>2019-10-16 21:54:52 +0000
committergVisor bot <gvisor-bot@google.com>2019-10-16 21:54:52 +0000
commitcde805cabdf5e82c40a7f1b7e3e846a828ffe22a (patch)
tree9f043d0a93a8b3a8dc26c06520074fdf42f2c9db /pkg/sentry/socket/unix/transport/queue.go
parent3151bfa70a20b4536c0a4d1492facc117281fa4f (diff)
parentd22f0534c07a2b1a21cecb88db80cbc662bbd5af (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.go16
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
+}