diff options
author | Ian Gudger <igudger@google.com> | 2018-06-26 12:40:23 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2018-06-26 12:41:22 -0700 |
commit | 5f7f78c1d7ee19b6a193d17c48f78edb220412aa (patch) | |
tree | 4a03734b643e353488b529c1e732c0a64c5f2dde | |
parent | 33041b36cb7e8e9795545837355e4576ff2be4da (diff) |
Fix data races in Unix sockets
PiperOrigin-RevId: 202175558
Change-Id: I0113cb9a90d7a0cd7964bf43eef67f70c92d9589
-rw-r--r-- | pkg/tcpip/transport/queue/queue.go | 2 | ||||
-rw-r--r-- | pkg/tcpip/transport/unix/unix.go | 12 |
2 files changed, 12 insertions, 2 deletions
diff --git a/pkg/tcpip/transport/queue/queue.go b/pkg/tcpip/transport/queue/queue.go index 2d2918504..0c90588ae 100644 --- a/pkg/tcpip/transport/queue/queue.go +++ b/pkg/tcpip/transport/queue/queue.go @@ -157,6 +157,8 @@ func (q *Queue) Peek() (Entry, *tcpip.Error) { // QueuedSize returns the number of bytes currently in the queue, that is, the // number of readable bytes. func (q *Queue) QueuedSize() int64 { + q.mu.Lock() + defer q.mu.Unlock() return q.used } diff --git a/pkg/tcpip/transport/unix/unix.go b/pkg/tcpip/transport/unix/unix.go index 72c21a432..34bdb5877 100644 --- a/pkg/tcpip/transport/unix/unix.go +++ b/pkg/tcpip/transport/unix/unix.go @@ -384,14 +384,22 @@ func vecCopy(data [][]byte, buf []byte) (uintptr, [][]byte, []byte) { // Readable implements Receiver.Readable. func (q *streamQueueReceiver) Readable() bool { + q.mu.Lock() + bl := len(q.buffer) + r := q.readQueue.IsReadable() + q.mu.Unlock() // We're readable if we have data in our buffer or if the queue receiver is // readable. - return len(q.buffer) > 0 || q.readQueue.IsReadable() + return bl > 0 || r } // RecvQueuedSize implements Receiver.RecvQueuedSize. func (q *streamQueueReceiver) RecvQueuedSize() int64 { - return int64(len(q.buffer)) + q.readQueue.QueuedSize() + q.mu.Lock() + bl := len(q.buffer) + qs := q.readQueue.QueuedSize() + q.mu.Unlock() + return int64(bl) + qs } // RecvMaxQueueSize implements Receiver.RecvMaxQueueSize. |