From ac32f52ca6e620556e7a875f0d52ddef72215532 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 3 Sep 2015 01:37:00 +0200 Subject: rlp: fix encReader returning nil buffers to the pool The bug can cause crashes if Read is called after EOF has been returned. No code performs such calls right now, but hitting the bug gets more likely as rlp.EncodeToReader gets used in more places. --- rlp/encode_test.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'rlp/encode_test.go') diff --git a/rlp/encode_test.go b/rlp/encode_test.go index 60bd95692..b550d4303 100644 --- a/rlp/encode_test.go +++ b/rlp/encode_test.go @@ -23,6 +23,7 @@ import ( "io" "io/ioutil" "math/big" + "sync" "testing" ) @@ -306,3 +307,25 @@ func TestEncodeToReaderPiecewise(t *testing.T) { return output, nil }) } + +// This is a regression test verifying that encReader +// returns its encbuf to the pool only once. +func TestEncodeToReaderReturnToPool(t *testing.T) { + buf := make([]byte, 50) + wg := new(sync.WaitGroup) + for i := 0; i < 5; i++ { + wg.Add(1) + go func() { + for i := 0; i < 1000; i++ { + _, r, _ := EncodeToReader("foo") + ioutil.ReadAll(r) + r.Read(buf) + r.Read(buf) + r.Read(buf) + r.Read(buf) + } + wg.Done() + }() + } + wg.Wait() +} -- cgit