From 72b4fa4a146ade0f59f96e27d2fbdc3f6ffd70d5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Jul 2018 12:11:49 +0200 Subject: [PATCH] fix #1205 --- app/dispatcher/default.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/dispatcher/default.go b/app/dispatcher/default.go index afe1f0de..8a0e6fe0 100644 --- a/app/dispatcher/default.go +++ b/app/dispatcher/default.go @@ -5,6 +5,7 @@ package dispatcher import ( "context" "strings" + "sync" "time" "v2ray.com/core" @@ -24,21 +25,27 @@ var ( ) type cachedReader struct { + sync.Mutex reader *pipe.Reader cache buf.MultiBuffer } func (r *cachedReader) Cache(b *buf.Buffer) { mb, _ := r.reader.ReadMultiBufferTimeout(time.Millisecond * 100) + r.Lock() if !mb.IsEmpty() { common.Must(r.cache.WriteMultiBuffer(mb)) } common.Must(b.Reset(func(x []byte) (int, error) { return r.cache.Copy(x), nil })) + r.Unlock() } func (r *cachedReader) ReadMultiBuffer() (buf.MultiBuffer, error) { + r.Lock() + defer r.Unlock() + if !r.cache.IsEmpty() { mb := r.cache r.cache = nil @@ -49,6 +56,9 @@ func (r *cachedReader) ReadMultiBuffer() (buf.MultiBuffer, error) { } func (r *cachedReader) ReadMultiBufferTimeout(timeout time.Duration) (buf.MultiBuffer, error) { + r.Lock() + defer r.Unlock() + if !r.cache.IsEmpty() { mb := r.cache r.cache = nil @@ -59,7 +69,10 @@ func (r *cachedReader) ReadMultiBufferTimeout(timeout time.Duration) (buf.MultiB } func (r *cachedReader) CloseError() { + r.Lock() r.cache.Release() + r.cache = nil + r.Unlock() r.reader.CloseError() }