1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Prevent stdout / stderr race condition in limitedBuffer.

Signed-off-by: Stephen Drake <stephen@xenolith.net>
This commit is contained in:
Stephen Drake 2016-09-12 19:24:07 +02:00
parent b248de7e33
commit c3319445aa

View file

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"runtime" "runtime"
"strings" "strings"
"sync"
"time" "time"
"golang.org/x/net/context" "golang.org/x/net/context"
@ -271,11 +272,15 @@ func (d *Daemon) stopHealthchecks(c *container.Container) {
// Buffer up to maxOutputLen bytes. Further data is discarded. // Buffer up to maxOutputLen bytes. Further data is discarded.
type limitedBuffer struct { type limitedBuffer struct {
buf bytes.Buffer buf bytes.Buffer
mu sync.Mutex
truncated bool // indicates that data has been lost truncated bool // indicates that data has been lost
} }
// Append to limitedBuffer while there is room. // Append to limitedBuffer while there is room.
func (b *limitedBuffer) Write(data []byte) (int, error) { func (b *limitedBuffer) Write(data []byte) (int, error) {
b.mu.Lock()
defer b.mu.Unlock()
bufLen := b.buf.Len() bufLen := b.buf.Len()
dataLen := len(data) dataLen := len(data)
keep := min(maxOutputLen-bufLen, dataLen) keep := min(maxOutputLen-bufLen, dataLen)
@ -290,6 +295,9 @@ func (b *limitedBuffer) Write(data []byte) (int, error) {
// The contents of the buffer, with "..." appended if it overflowed. // The contents of the buffer, with "..." appended if it overflowed.
func (b *limitedBuffer) String() string { func (b *limitedBuffer) String() string {
b.mu.Lock()
defer b.mu.Unlock()
out := b.buf.String() out := b.buf.String()
if b.truncated { if b.truncated {
out = out + "..." out = out + "..."